QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#378061 | #7736. Red Black Tree | phtniit | WA | 224ms | 165688kb | C++14 | 2.3kb | 2024-04-05 23:53:58 | 2024-04-05 23:53:58 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std ;
const int maxn = 100010;
const int inf = 1e9+7;
using pii = pair<int, int>;
struct S {
int len;
int l, r, v;
deque<int> rig;
deque<int> lef;
} s[maxn];
vector<int> g[maxn];
char col[maxn];
void dfs(int u) {
auto& su = s[u];
if (g[u].empty()) {
su.len = 1;
su.v = 0;
su.lef.clear();
su.rig.clear();
if (col[u] == '1') {
su.l = su.r = 1;
su.lef.emplace_back(1);
} else {
su.l = su.r = 0;
su.rig.emplace_back(1);
}
return;
}
int L = inf;
for (auto v: g[u]) {
dfs(v);
L = min(L, s[v].len);
}
if (g[u].size() == 1) {
int v = g[u][0];
auto& sv = s[v];
su.l = sv.l;
su.r = sv.r;
su.v = sv.v;
swap(su.lef, sv.lef);
swap(su.rig, sv.rig);
} else {
vector<int> dp(L+1);
for (auto v: g[u]) {
auto& sv = s[v];
int w = sv.v, sr = sv.r, sl = sv.l;
for (int i = sl; i <= sr && i <= L; ++i) dp[i] += w;
while (not sv.rig.empty()) {
w += sv.rig.front();
sv.rig.pop_front();
if (++sr <= L) {
dp[sr] += w;
}
}
w = sv.v;
while (not sv.lef.empty()) {
w += sv.lef.back();
sv.lef.pop_back();
if (--sl <= L) {
dp[sl] += w;
}
}
}
su.r = 0;
for (int i = 1; i <= L; ++i) if (dp[i] < dp[su.r]) {
su.r = i;
}
su.l = L;
for (int i = L-1; i >= 0; --i) if (dp[i] < dp[su.l]) {
su.l = i;
}
su.v = dp[su.l];
su.lef.clear();
su.rig.clear();
for (int i = su.l-1; i >= 0; --i) su.lef.emplace_front(dp[i] - dp[i+1]);
for (int i = su.r+1; i <= L; ++i) su.rig.emplace_back(dp[i] - dp[i-1]);
}
su.len = L+1;
if (col[u] == '1') { // black
su.l++;
su.r++;
su.lef.emplace_back(1);
} else { // red
su.rig.emplace_front(1);
}
}
void once() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
g[i].clear();
}
scanf("%s", col+1);
for (int i = 2, p; i <= n; ++i) {
scanf("%d", &p);
g[p].push_back(i);
}
dfs(1);
for (int i = 1; i <= n; ++i) printf("%d ", s[i].v);
puts("");
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
once();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 24ms
memory: 142380kb
input:
2 9 101011110 1 1 3 3 3 6 2 2 4 1011 1 1 3
output:
4 1 2 0 0 0 0 0 0 2 0 0 0
result:
ok 2 lines
Test #2:
score: -100
Wrong Answer
time: 224ms
memory: 165688kb
input:
6107 12 000000001000 1 2 3 2 5 4 4 7 3 8 11 19 1100111101111011110 1 2 1 1 4 5 2 4 3 2 2 7 10 2 11 3 15 5 7 0111110 1 1 2 2 1 5 3 000 1 1 7 1000011 1 2 3 3 5 4 7 0001001 1 1 1 3 5 3 8 00111000 1 1 3 2 5 2 7 11 11111110111 1 1 1 4 5 4 5 2 5 1 15 110101101000010 1 2 3 2 1 5 2 5 6 5 8 7 9 14 10 0101000...
output:
1 1 1 1 0 0 0 0 0 0 0 0 6 2 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 2 1 0 0 0 0 0 0 4 0 0 2 1 0 0 0 0 0 0 4 3 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 0 0 7 5 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 6 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0...
result:
wrong answer 11th lines differ - expected: '6 5 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0', found: '7 5 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 '