QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#646240 | #7434. 冷たい部屋、一人 | forgotmyhandle | WA | 822ms | 223924kb | C++14 | 8.8kb | 2024-10-16 21:51:40 | 2024-10-16 21:51:41 |
Judging History
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'