QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#646240#7434. 冷たい部屋、一人forgotmyhandleWA 822ms223924kbC++148.8kb2024-10-16 21:51:402024-10-16 21:51:41

Judging History

你现在查看的是最新测评结果

  • [2024-10-16 21:51:41]
  • 评测
  • 测评结果:WA
  • 用时:822ms
  • 内存:223924kb
  • [2024-10-16 21:51:40]
  • 提交

answer

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cassert>
#include <math.h>
#include <vector>
using namespace std;
static char buf[1000005], *p1 = buf, *p2 = buf;
inline char nnc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000005, stdin), p1 == p2) ? EOF : *p1++; }
// #define nnc getchar
inline int read() {
    int ret = 0, neg = 0;
    char c = 0;
    while (c < '0' || c > '9') c = nnc(), c == '-' ? (neg = 1) : 0;
    while ('0' <= c && c <= '9') ret = ret * 10 + c - 48, c = nnc();
    return ret * (neg ? -1 : 1);
}
int n, q, B;
int a[500005], p[500005], _p[500005];
struct qquery {
    int l, r, id;
} qs[500005], qrec[500005];
int cnt[500005], big[500005], lg2[500005];
long long ans[500005];
vector<int> vec[500005];
struct RMQ {
    pair<int, int> mx[21][500005], mn[21][500005];
    void Build() {
        for (int i = 1; (1 << i) <= n; i++) {
            for (int j = 1; j + (1 << i) - 1 <= n; j++) {
                mx[i][j] = max(mx[i - 1][j], mx[i - 1][j + (1 << (i - 1))]);
                mn[i][j] = min(mn[i - 1][j], mn[i - 1][j + (1 << (i - 1))]);
            }
        }
    }
    inline pair<int, int> QueryMax(int l, int r) {
        if (l > r) 
            return make_pair(0, 0);
        int k = lg2[r - l + 1];
        return max(mx[k][l], mx[k][r - (1 << k) + 1]);
    }
    inline pair<int, int> QueryMin(int l, int r) {
        if (l > r) 
            return make_pair(n + 1, 0);
        int k = lg2[r - l + 1];
        return min(mn[k][l], mn[k][r - (1 << k) + 1]);
    }
    inline int Qmax(int l, int r) { return QueryMax(l, r).first; }
    inline int Qmin(int l, int r) { return QueryMin(l, r).first; }
} rmq;
struct Block {
    int bel[500005], S;
    int s[1005], val[500005];
    int L[1005], R[1005];
    void Build(int x) {
        S = x;
        for (int i = 1; i <= n;) {
            int id = (i - 1) / S + 1;
            L[id] = i, R[id] = min(n, i + S - 1);
            for (int j = L[id]; j <= R[id]; j++) bel[j] = id;
            i += S;
        }
    }
    inline void Add(int x, int y = 1) { val[x] += y, s[bel[x]] += y; }
    int Query(int l, int r) {
        int ret = 0;
        if (bel[l] == bel[r]) {
            for (int i = l; i <= r; i++) ret += val[i];
            return ret;
        }
        int pl = bel[l], pr = bel[r];
        for (int i = l; i <= R[pl]; i++) ret += val[i];
        for (int i = pl + 1; i < pr; i++) ret += s[i];
        for (int i = L[pr]; i <= r; i++) ret += val[i];
        return ret;
    }
} blk;
namespace Small {
    struct Cpr {
        int v, L, l, r, R, id;
    } cpr[500005];
    int cprcnt;
    inline void decpr(Cpr c) {
        int x = c.id;
        for (int i = c.L; i <= c.l; i++) {
            for (int j = c.r; j <= c.R; j++) 
                blk.Add(rmq.Qmax(vec[x][i], vec[x][j]));
        }
    }
    void work() {
        blk.Build(1000);
        for (int i = 1; i <= n; i++) {
            if (big[i]) 
                continue;
            for (int j = 1; j < cnt[i]; j++) {
                int a = vec[i][j - 1], b = vec[i][j];
                int x = j - 1, y = j, z = rmq.Qmin(a, b);
                while (x && rmq.Qmin(vec[i][x - 1], b) == z) --x;
                if (rmq.QueryMin(a, b).second != b) 
                    while (y < cnt[i] - 1 && rmq.Qmin(a, vec[i][y + 1]) == z) ++y;
                cpr[++cprcnt] = (Cpr) { z, x, j - 1, j, y, i };
            }
        }
        sort(cpr + 1, cpr + cprcnt + 1, [](Cpr a, Cpr b) { return a.v < b.v; });
        sort(qs + 1, qs + q + 1, [](qquery a, qquery b) { return a.l < b.l; });
        for (int i = q, j = cprcnt; i; i--) {
            while (j && cpr[j].v >= qs[i].l) decpr(cpr[j--]);
            ans[qs[i].id] += blk.Query(1, qs[i].r);
        }
    }
}
namespace Large {
    int onv[500005], o[500005], _o[500005], ocnt;
    int key[500005], kcnt, S, T;
    int bel[500005];
    struct List {
        int al[500005], ar[500005], av[500005];
        pair<int, int> his[500005];
        int n, cur;
        long long ans;
        bool act[500005];
        void ini(int x) {
            ans = cur = 0;
            n = x;
            for (int i = 1; i <= x; i++) al[i] = ar[i] = i, av[i] = (onv[p[_o[i]]] == 1), act[i] = 0;
        }
        void Connect(int x, int y) {
            ++cur;
            his[cur] = make_pair(x, y);
            int l = al[x], r = ar[y];
            ans += 1ll * av[l] * av[y];
            ar[l] = r, al[r] = l, av[l] += av[y];
        }
        void Rollback(int t) {
            while (cur > t) {
                int x = his[cur].first, y = his[cur].second;
                int l = al[x], r = ar[y];
                ar[l] = x, al[r] = y, av[l] -= av[y];
                ans -= 1ll * av[l] * av[y];
                --cur;
            }
        }
        void Insert(int i) {
            act[i] = 1;
            (act[i - 1]) ? Connect(i - 1, i) : void();
            (act[i + 1]) ? Connect(i, i + 1) : void();
        }
    } lis;
    int R[500005];
    vector<qquery> v1[500005];
    vector<pair<int, int> > v2[500005];
    void Backroll_MoQueue() {
        S = 1 + kcnt / sqrt(q);
        for (int i = 1; i <= kcnt; i++) bel[i] = (i - 1) / S + 1, R[bel[i]] = i;
        T = bel[kcnt];
        for (int i = 1; i <= T; i++) v1[i].clear();
        // sort(qs + 1, qs + q + 1, [](qquery a, qquery b) { return bel[a.l] == bel[b.l] ? (a.r < b.r) : (a.l < b.l); });
        for (int i = 1; i <= q; i++) qs[i].l <= qs[i].r ? v1[bel[qs[i].l]].emplace_back(qs[i]) : void();
        lis.ini(kcnt);
        for (int id = 1; id <= T; id++) {
            lis.Rollback(0);
            int mxr = 0;
            for (auto v : v1[id]) v2[v.r].emplace_back(make_pair(v.l, v.id)), mxr = max(mxr, v.r);
            for (int rr = R[id - 1] + 1; rr <= R[id]; rr++) {
                for (auto v : v2[rr]) {
                    for (int a = v.first; a <= rr; a++) lis.Insert(o[_p[key[a]]]);
                    ans[v.second] += lis.ans;
                    lis.Rollback(0);
                    for (int a = v.first; a <= rr; a++) lis.act[o[_p[key[a]]]] = 0;
                }
                v2[rr].clear();
            }
            for (int r = R[id] + 1; r <= mxr; r++) {
                lis.Insert(o[_p[key[r]]]);
                for (auto v : v2[r]) {
                    int l = R[id] + 1;
                    int tmp = lis.cur;
                    while (l > v.first) lis.Insert(o[_p[key[--l]]]);
                    ans[v.second] += lis.ans;
                    lis.Rollback(tmp);
                    while (l <= R[id]) lis.act[o[_p[key[l++]]]] = 0;
                }
                v2[r].clear();
            }
            while (mxr > R[id]) lis.act[o[_p[key[mxr--]]]] = 0;
        }
    }
    void work() {
        for (int i = 1; i <= n; i++) {
            if (!big[i]) 
                continue;
            for (int j = 0; j <= n + 1; j++) onv[j] = 0, o[j] = 0;
            ocnt = kcnt = 0;
            for (int j = 1; j < cnt[i]; j++) {
                int a = vec[i][j - 1], b = vec[i][j];
                onv[rmq.Qmax(a, b)] = onv[rmq.Qmin(a, b)] = 2;
            }
            for (int j = 0; j < cnt[i]; j++) onv[p[vec[i][j]]] = 1;
            for (int j = 1; j <= n; j++) onv[j] ? (key[++kcnt] = j, o[_p[j]] = 1) : 0;
            for (int j = 1; j <= n; j++) (o[j] ? (_o[++ocnt] = j) : 0), o[j] += o[j - 1];
            for (int j = 1; j <= q; j++) {
                // assert(o[qrec[j].l] + (o[qrec[j].l] == o[qrec[j].l - 1]) == lower_bound(key + 1, key + kcnt + 1, qrec[j].l) - key);
                // assert(o[qrec[j].r] == upper_bound(key + 1, key + kcnt + 1, qrec[j].r) - key - 1);
                // qs[j].l = lower_bound(key + 1, key + kcnt + 1, qrec[j].l) - key;
                qs[j].l = o[_p[qrec[j].l]] + (o[_p[qrec[j].l]] == o[_p[qrec[j].l] - 1]);
                // qs[j].r = upper_bound(key + 1, key + kcnt + 1, qrec[j].r) - key - 1;
                qs[j].r = o[_p[qrec[j].r]];
                qs[j].id = j;
            }
            Backroll_MoQueue();
        }
    }
}
int main() {
    // freopen("G.in", "r", stdin);
    // freopen("G.out", "w", stdout);
    B = 3200;
    n = read(), q = read();
    lg2[0] = -1;
    for (int i = 1; i <= n; i++) lg2[i] = lg2[i - 1] + ((i & (i - 1)) == 0);
    for (int i = 1; i <= n; i++) a[i] = read(), cnt[a[i]]++, vec[a[i]].emplace_back(i);
    for (int i = 1; i <= n; i++) p[i] = read(), rmq.mx[0][i] = rmq.mn[0][i] = make_pair(p[i], i), _p[p[i]] = i;
    for (int i = 1; i <= q; i++) qs[i].l = read(), qs[i].r = read(), qs[i].id = i;
    for (int i = 1; i <= n; i++) big[i] = (cnt[i] >= B);
    memcpy(qrec, qs, sizeof qs);
    rmq.Build();
    Small::work();
    Large::work();
    for (int i = 1; i <= q; i++) cout << ans[i] << "\n";
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 99240kb

input:

100 100
4 1 5 1 2 1 7 5 3 7 2 3 6 6 5 3 2 2 4 1 6 5 6 2 2 2 7 6 1 3 6 3 5 6 7 6 1 2 3 3 4 2 1 1 5 4 4 3 6 7 1 1 6 1 5 6 2 3 7 4 2 4 6 7 7 3 5 3 7 2 3 3 5 1 4 7 1 2 2 5 2 2 4 3 4 7 2 7 7 3 7 3 6 6 5 4 5 4 7 6
93 52 12 70 25 36 18 37 27 99 68 40 84 3 76 57 60 19 33 41 92 87 58 13 15 43 28 63 64 59 31 ...

output:

1
0
13
71
1
1
3
7
0
0
2
1
3
20
12
6
61
24
1
0
0
2
3
19
0
0
6
2
0
0
4
1
135
0
19
1
1
29
14
39
1
0
1
7
7
0
12
3
0
1
0
1
1
5
0
28
14
19
2
1
0
0
6
5
0
0
2
7
5
1
2
2
0
1
11
1
0
1
0
10
0
0
5
1
33
1
17
2
1
22
20
1
2
0
0
16
0
1
1
15

result:

ok 100 numbers

Test #2:

score: 0
Accepted
time: 8ms
memory: 101228kb

input:

100 100
8 8 2 8 8 12 11 8 5 5 5 1 7 6 6 11 3 13 1 12 2 2 4 1 11 13 10 7 1 2 4 3 1 12 1 5 13 8 1 5 12 5 12 4 6 3 5 4 8 3 4 1 4 3 9 2 11 9 4 8 12 3 5 13 13 1 9 12 2 13 8 13 4 13 12 5 12 13 2 6 4 4 1 6 6 9 12 7 4 3 10 7 1 7 7 10 4 12 3 9
96 87 12 73 74 78 99 76 7 77 54 88 90 86 95 94 31 83 27 11 66 91 ...

output:

0
6
2
0
0
1
16
1
1
10
7
9
2
8
2
1
3
5
0
7
2
0
2
0
1
0
7
0
0
1
108
0
0
0
6
4
1
0
2
13
0
3
0
10
0
0
1
21
0
18
0
11
0
8
13
9
0
0
0
11
12
2
1
0
2
16
1
7
0
16
0
2
3
7
0
2
10
1
4
2
6
0
0
6
3
0
0
0
5
7
0
0
6
0
7
0
4
0
3
0

result:

ok 100 numbers

Test #3:

score: 0
Accepted
time: 7ms
memory: 99460kb

input:

100 100
13 4 2 1 1 2 1 39 20 1 1 1 33 1 1 1 9 37 21 7 14 58 1 3 19 29 40 56 2 1 3 1 42 1 1 13 1 3 5 4 49 1 1 8 8 3 1 14 1 1 2 6 17 3 2 2 2 9 3 1 17 90 1 1 1 1 8 14 17 16 1 33 15 20 46 22 2 20 11 1 28 3 1 4 1 17 3 9 10 2 1 2 2 6 1 1 3 17 27 2
86 82 24 49 50 32 63 20 53 11 60 1 16 27 15 14 12 88 52 17...

output:

1
84
13
0
7
4
26
1
9
1
7
3
10
0
7
3
6
4
4
0
13
1
0
4
4
0
40
22
36
0
5
6
0
37
28
213
1
6
10
4
0
3
5
0
3
5
25
2
0
1
3
12
1
39
0
8
4
2
6
0
6
4
23
17
0
0
4
13
6
6
0
0
6
10
11
30
0
7
10
10
101
0
1
0
62
0
10
100
26
4
5
1
24
0
1
4
15
3
0
6

result:

ok 100 numbers

Test #4:

score: 0
Accepted
time: 4ms
memory: 98820kb

input:

100 100
1 1 1 1 1 36 58 18 15 1 1 2 1 1 1 1 4 10 9 2 2 4 28 1 2 1 2 2 28 27 12 6 3 10 1 1 2 1 1 2 7 40 1 4 8 17 16 3 5 1 2 2 16 5 6 1 5 3 4 11 1 1 11 51 11 4 3 7 14 16 1 11 1 2 8 3 4 1 1 3 2 5 21 7 3 10 2 2 1 20 23 1 3 6 1 1 15 3 34 1
8 1 2 3 92 48 11 43 9 71 69 5 6 7 12 26 31 45 80 83 14 16 17 25 2...

output:

29
1
9
19
6
1
3
2
0
16
15
2
11
14
24
191
25
21
33
34
19
2
0
0
11
32
1
9
2
16
24
28
9
0
123
4
6
0
13
69
271
15
47
6
0
121
0
1
15
1
9
61
0
63
10
2
2
13
55
25
12
2
40
4
3
39
14
15
0
15
2
48
6
0
0
6
0
5
0
11
3
1
78
9
12
0
0
14
15
38
7
3
0
12
10
0
1
6
0
22

result:

ok 100 numbers

Test #5:

score: 0
Accepted
time: 7ms
memory: 99180kb

input:

100 100
1 15 6 12 6 13 8 8 3 5 14 5 7 13 8 1 1 3 8 5 4 7 9 1 1 7 4 14 7 5 4 6 7 5 11 6 4 14 8 11 12 9 12 14 10 12 9 14 14 11 12 12 11 8 5 11 10 6 13 5 6 4 6 15 10 2 13 12 7 15 9 14 15 1 9 9 8 4 5 2 2 5 13 14 12 5 9 13 7 12 1 1 1 7 10 5 11 4 4 6
17 65 39 50 77 97 44 15 72 11 8 59 74 14 1 3 5 68 21 4 ...

output:

24
5
0
4
0
1
0
0
2
0
2
11
0
13
12
3
19
0
0
0
5
1
0
0
14
0
9
0
1
22
7
25
44
0
7
0
0
3
27
1
0
0
8
3
0
0
2
2
18
26
63
15
2
28
0
1
8
10
18
19
4
0
0
5
0
0
3
15
5
63
5
8
29
0
14
8
7
2
3
1
1
1
2
1
6
8
0
0
19
0
20
0
3
11
0
4
6
5
55
0

result:

ok 100 numbers

Test #6:

score: 0
Accepted
time: 8ms
memory: 122396kb

input:

5000 5000
2 29 12 10 25 32 45 18 16 38 41 50 8 32 54 37 18 29 37 42 9 38 25 43 35 5 47 20 32 35 8 14 8 37 30 16 45 19 14 33 14 31 31 33 28 12 11 49 32 6 11 4 50 39 3 55 25 26 13 40 41 44 31 31 18 19 25 18 29 19 21 1 52 19 2 53 39 55 11 27 54 22 16 49 12 23 41 22 34 38 40 20 5 35 43 40 29 14 20 40 6 ...

output:

21908
618
65611
229
7839
55433
12508
4205
5
12239
31375
1958
20
2290
29810
13020
12234
5752
14318
13451
122
0
109
3852
26843
12709
11522
14307
45468
886
5020
6667
21808
3367
637
593
37
5078
2698
61
364
20500
88231
2311
39
2487
18627
3425
194
4845
54212
84095
14695
8
67509
4364
312
23989
3876
86722
1...

result:

ok 5000 numbers

Test #7:

score: 0
Accepted
time: 16ms
memory: 127572kb

input:

5000 5000
15 86 121 63 26 26 74 43 35 32 48 131 61 120 103 48 101 1 70 97 130 105 30 38 68 141 85 141 108 17 143 106 47 90 4 68 63 8 79 26 10 66 48 61 18 75 62 84 80 113 20 27 109 102 32 13 20 63 12 53 112 146 33 27 49 110 55 132 121 67 75 18 38 80 140 62 7 20 104 4 42 91 67 20 127 77 13 141 64 3 28...

output:

0
132
8
26
0
32
1
61
40
0
0
0
0
18
49
15
0
14
2
63
24
9
10
94
10
21
1
2
1
6
17
21
1
83
19
9
0
21
67
8
13
0
0
0
13
1
0
21
0
13
1
123
0
0
8
0
0
10
14
2
32
2
8
53
29
0
23
6
6
0
0
13
0
1
0
3
0
0
1
0
5
15
15
0
4
4
1
0
1
0
0
2
1
0
0
0
0
1
2
1
11
23
45
1
0
9
14
104
60
8
3
1
2
38
34
32
1
0
0
38
27
18
62
0
5...

result:

ok 5000 numbers

Test #8:

score: 0
Accepted
time: 15ms
memory: 126772kb

input:

5000 5000
342 3 498 1667 87 63 8 215 1 25 67 5 7 600 1 1 51 14 6 1990 7 2707 105 637 5 805 328 74 1 57 316 236 6 1 1 700 965 2 493 21 12 2 1 1626 1 1352 11 109 1 2253 70 4 788 55 140 1 2 1 57 21 1 530 3060 62 266 86 32 1861 1 173 2 2 234 1 402 1392 101 9 7 1 8 3 8 137 46 4 17 212 1 4 10 6 1389 200 4...

output:

31295
316
211
102
965
1000
240
6385
76
10466
792
35
1756
169788
1195
1314
387
227
1144
30655
418
111933
122174
553
30337
24
67
125165
1286
28309
2796
6724
354
4078
17
138
11139
1
56797
1
2093
300
103019
8
257
28645
121966
128335
119276
5970
21
122331
475
103019
4
298
179
32016
121637
194237
53
12189...

result:

ok 5000 numbers

Test #9:

score: 0
Accepted
time: 12ms
memory: 127560kb

input:

5000 5000
27 32 25 415 15 148 94 43 16 3 71 1 11 33 159 1196 1069 752 1937 1 35 29 12 1 389 38 8 49 1 1 582 7 1274 30 9 123 68 14 3 7 88 4 11 3126 176 1304 6 659 118 128 1 537 100 784 225 42 37 36 2 15 2 359 411 60 4 261 1 3 61 11 88 154 2674 162 1014 1875 1 3 139 3 196 8 67 99 187 559 2 1 459 10 1 ...

output:

85
28
1761
27
50
45
0
43
1
3
5
4
15
425
0
1
7
23
1
42
0
0
7
51
3
27
28
3
26
0
58
82
53
494
9
88
33
33
17
49
9
0
63
105
0
9
17
1
252
11
3
107
1
2
0
0
17
24
5
414
0
70
98
40
29
553
216
521
2
246
0
122
6
14
0
4
70
310
72
23
191
115
5
3
12
0
0
6292
10
64
16
8
17
28
0
3
157
1
3
32
64
0
26
14
307
1
19
26
...

result:

ok 5000 numbers

Test #10:

score: 0
Accepted
time: 8ms
memory: 128648kb

input:

5000 5000
11 23 46 15 52 41 22 12 24 42 36 22 61 6 21 31 43 15 11 54 20 58 57 39 51 14 2 41 35 20 16 12 9 25 39 8 60 32 20 60 51 52 19 34 19 60 33 48 17 42 12 50 38 4 30 16 48 49 55 58 57 5 39 61 39 32 51 14 2 10 57 43 41 8 12 5 58 36 14 34 32 17 49 24 60 58 55 60 25 18 6 3 44 47 7 17 24 5 10 35 7 1...

output:

608
171
30
6024
1921
142
1462
718
16
5
2
143
1939
971
40
59
3345
98
679
54
405
318
55
399
28
642
1481
0
58
1874
1591
0
1076
3357
465
3566
763
532
2615
337
0
1842
140
588
1753
0
197
3945
1753
33
1868
105
33
167
917
0
1895
45
1364
3626
1555
235
30
1964
4545
5583
360
214
530
263
1895
892
18
823
99
2593...

result:

ok 5000 numbers

Test #11:

score: 0
Accepted
time: 344ms
memory: 210144kb

input:

200000 200000
450 380 429 292 321 431 244 311 46 303 35 470 556 53 249 617 400 730 447 823 508 364 616 659 843 840 80 572 310 461 342 805 733 267 441 810 191 675 618 165 380 64 359 514 592 304 551 679 492 484 24 355 489 456 61 590 445 588 470 836 493 213 730 417 675 436 496 393 677 10 397 143 573 44...

output:

19810
486331
568929
123972
48879
617941
1254986
1109929
112192
594018
0
560940
13348
1728346
38662
16235
53474
756623
447220
925352
1878
8672
17371
853
144927
1300294
114644
72
104581
59
386661
1138358
1613460
160107
493876
88493
1693729
248416
553305
21021
174725
39537
35619
7653
270063
863775
2837...

result:

ok 200000 numbers

Test #12:

score: -100
Wrong Answer
time: 822ms
memory: 223924kb

input:

200000 200000
19366 9283 162 4589 57 291 1 3 12 278 10 672 3 26 4 1 162500 668 1239 4473 2202 126 7615 9046 4210 1277 6 931 7 73 788 1779 8309 782 4 31785 414 4639 13637 753 5 1 66995 9 38399 9 1 38 7 12 111 88737 1020 1 219 3 18605 3 42958 22 1 7920 1 7602 12 320 1 2 329 3404 15 47 1 10 4 3 983 3 5...

output:

598832
775569
457574
72411
464
245088
58866
49241
157457
177861
819590
136652
792184
3833615
1
498953
2444
5208
2052
33535
24945
390536
92981
9846
733731
4872164
3929498
1592240
481238
457977
828749
152273
365591
35666
12997
9535
1602300
867580
123804
301370
49107
356145
34705
462992
12310
65563
921...

result:

wrong answer 1st numbers differ - expected: '440126', found: '598832'