ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#199160 | #2131. roku | tkswls | 100 | 1123ms | 110608kb | C++11 | 2.1kb | 2023-12-05 11:20:33 | 2023-12-05 12:07:22 |
answer
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int n, f[200005], a[200005], rt[200005], fail[200005];
struct node {
int name, num;
};
vector<node> son[200005];
struct XDN {
int l, r, ls, rs, num = 0;
} b[5000006];
int ccnt = 0;
inline void insert(int p, int l, int r, int q, int w) {
b[p].l = l, b[p].r = r;
if (l == r) {
b[p].num = w;
return;
}
if (q <= ((l + r) >> 1)) {
b[p].ls = ++ccnt;
insert(ccnt, l, (l + r) >> 1, q, w);
} else {
b[p].rs = ++ccnt;
insert(ccnt, ((l + r) >> 1) + 1, r, q, w);
}
}
inline int change(int p, int q, int w) {
b[++ccnt] = b[p];
p = ccnt;
if (b[p].l == b[p].r) {
b[p].num = w;
return p;
}
if (q <= (b[p].l + b[p].r) / 2) {
if (!b[p].ls) {
b[p].ls = ++ccnt;
insert(ccnt, (b[p].l), (b[p].l + b[p].r) >> 1, q, w);
} else {
b[p].ls = change(b[p].ls, q, w);
}
} else {
if (!b[p].rs) {
b[p].rs = ++ccnt;
insert(ccnt, ((b[p].l + b[p].r) >> 1) + 1, b[p].r, q, w);
} else {
b[p].rs = change(b[p].rs, q, w);
}
}
return p;
}
inline int query(int p, int q) {
if (b[p].l == b[p].r) return b[p].num;
if (q <= (b[p].l + b[p].r) / 2) {
if (!b[p].ls) return 0;
return query(b[p].ls, q);
} else {
if (!b[p].rs) return 0;
return query(b[p].rs, q);
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> f[i];
}
for (int i = 1; i <= n; i++) {
cin >> a[i];
son[f[i]].push_back(node{a[i], i});
}
ccnt = 1;
b[1].l = 1, b[1].r = n;
rt[0] = 1;
for (int i = 0; i < son[0].size(); i++) {
rt[0] = change(rt[0], son[0][i].name, son[0][i].num);
}
queue<int> q;
for (int i = 0; i < son[0].size(); i++) {
q.push(son[0][i].num);
}
while (q.size()) {
int i = q.front();
q.pop();
if (f[i] == 0) {
fail[i] = 0;
} else {
fail[i] = query(rt[fail[f[i]]], a[i]);
}
rt[i] = rt[fail[i]];
for (int j = 0; j < son[i].size(); j++) {
rt[i] = change(rt[i], son[i][j].name, son[i][j].num);
q.push(son[i][j].num);
}
}
for (int i = 1; i <= n; i++) {
cout << fail[i] << ' ';
}
}
Details
小提示:点击横条可展开更详细的信息
Subtask #1:
score: 30
Accepted
Test #1:
score: 30
Accepted
time: 8ms
memory: 103640kb
input:
20 0 0 0 0 0 2 1 4 2 5 9 11 12 3 14 6 1 7 8 6 13 10 16 3 2 3 2 2 2 2 2 2 2 2 2 3 3 2 2 2
output:
0 0 0 0 0 4 5 5 5 5 10 10 10 5 10 4 4 10 10 8
result:
ok 20 numbers
Test #2:
score: 0
Accepted
time: 7ms
memory: 103652kb
input:
200 0 1 0 2 4 5 0 2 8 2 3 0 1 3 8 14 13 16 12 14 7 7 6 23 11 0 19 1 13 16 12 21 8 6 5 1 22 4 15 24 4...
output:
0 3 0 1 74 12 0 14 3 99 54 0 54 26 20 56 3 57 54 85 26 12 19 69 90 0 90 1 1 112 3 85 16 68 26 12 44 ...
result:
ok 200 numbers
Test #3:
score: 0
Accepted
time: 12ms
memory: 103720kb
input:
2000 0 1 1 1 1 4 5 1 0 2 10 2 7 8 8 11 11 13 0 4 11 11 10 9 7 5 4 23 12 20 17 29 13 20 29 12 23 29 3...
output:
0 0 85 0 19 0 1476 296 0 1800 19 9 43 1800 296 1476 85 88 0 0 9 19 1800 0 8 237 85 0 24 1 9 9 864 29...
result:
ok 2000 numbers
Subtask #2:
score: 70
Accepted
Test #4:
score: 70
Accepted
time: 181ms
memory: 110604kb
input:
200000 0 1 0 0 4 3 5 4 0 6 10 4 3 12 1 11 1 6 12 15 14 5 6 6 5 9 11 18 17 18 16 22 28 33 19 18 19 3 ...
output:
0 79 0 0 1050 9 7058 9 0 844 15965 830 10823 9147 9 152147 535 119 41447 26 1924 0 10823 101 0 1 326...
result:
ok 200000 numbers
Test #5:
score: 0
Accepted
time: 182ms
memory: 110604kb
input:
200000 0 1 0 0 2 3 5 3 4 9 2 4 7 3 8 8 3 15 15 9 8 6 4 12 1 14 8 3 9 17 18 20 0 7 3 11 20 1 36 35 35...
output:
0 1 0 0 2423 33 147931 67 581 8281 100716 446 40934 446 150 33 38169 6195 142024 8674 385 143 33 187...
result:
ok 200000 numbers
Test #6:
score: 0
Accepted
time: 157ms
memory: 110608kb
input:
200000 0 0 1 1 1 4 0 3 5 9 9 9 7 6 7 5 7 0 18 12 14 5 7 10 18 12 5 25 5 7 0 17 15 33 10 1 7 22 11 36...
output:
0 0 8607 18 155 19 0 26798 5602 8607 52496 47618 7 3192 47618 165108 1303 0 1 1881 12040 33654 155 8...
result:
ok 200000 numbers
Test #7:
score: 0
Accepted
time: 163ms
memory: 109952kb
input:
200000 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3...
output:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36...
result:
ok 200000 numbers
Test #8:
score: 0
Accepted
time: 144ms
memory: 109952kb
input:
200000 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3...
output:
0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ...
result:
ok 200000 numbers
Test #9:
score: 0
Accepted
time: 133ms
memory: 110212kb
input:
200000 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 200000 numbers
Test #10:
score: 0
Accepted
time: 136ms
memory: 110208kb
input:
200000 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 200000 numbers