QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#344991 | #7736. Red Black Tree | ucup-team173 | RE | 0ms | 0kb | C++20 | 3.7kb | 2024-03-05 22:25:42 | 2024-03-05 22:25:43 |
answer
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define Mp make_pair
#define pb push_back
#define SZ(a) (int(a.size()))
typedef long long ll;
typedef double db;
typedef std::pair<int, int> pii;
typedef std::vector<int> vi;
std::mt19937_64 gen(std::chrono::system_clock::now().time_since_epoch().count());
ll get(ll l, ll r) { std::uniform_int_distribution<ll> dist(l, r); return dist(gen); }
void solve() {
int n;
cin >> n;
string s;
cin >> s;
s = ' ' + s;
vector G(n + 1, vi());
for(int i = 2; i <= n; i++) {
int p;
cin >> p;
G[p].pb(i);
}
vector pos(n + 1, vi()), neg(n + 1, vi());
vi cnt(n + 1), dep(n + 1), p(n + 1), ans(n + 1), sz(n + 1);
function<void(int)> dfs = [&](int x) {
dep[x] = 1e9, sz[x] = s[x] == '1';
for(int y : G[x]) {
dfs(y);
dep[x] = min(dep[x], dep[y] + 1);
sz[x] += sz[y];
}
sort(G[x].begin(), G[x].end(), [&](int a, int b) {
return dep[a] < dep[b];
});
int fir;
if(SZ(G[x])) {
fir = G[x][0];
swap(pos[x], pos[fir]);
swap(neg[x], neg[fir]);
swap(cnt[x], cnt[fir]);
swap(p[x], p[fir]);
}
for(int y : G[x]) if(y != fir) {
assert(SZ(neg[y]) + cnt[y] + SZ(pos[y]) - p[y] == dep[y]);
int lst = dep[y] - dep[x] + 1;
while(lst && p[y] < SZ(pos[y])) p[y]++, lst--;
while(lst && cnt[y]) cnt[y]--, lst--;
while(lst && SZ(neg[y])) neg[y].pop_back(), lst--;
for(int i = 0; i < SZ(neg[y]); i++) {
if(i < SZ(neg[x])) {
neg[x][i] += neg[y][i];
} else if(i < SZ(neg[x]) + cnt[x]) {
cnt[x]--, neg[x].pb(neg[y][i]);
} else {
int id = SZ(pos[x]) - (i - SZ(neg[x]) - cnt[x]) - 1;
pos[x][id] += neg[y][i];
if(pos[x][id] == 0) {
cnt[x]++;
pos[x].pop_back();
} else if(pos[x][id] < 0) {
neg[x].pb(pos[x][id]);
pos[x].pop_back();
}
}
}
for(int i = 0; i + p[y] < SZ(pos[y]); i++) {
if(i + p[x] < SZ(pos[x])) {
pos[x][i + p[x]] += pos[y][i + p[y]];
} else if(i + p[x] - SZ(pos[x]) < cnt[x]) {
cnt[x]--, pos[x].pb(pos[y][i + p[y]]);
} else {
int id = SZ(neg[x]) - (i + p[x] - SZ(pos[x]) - cnt[x]) - 1;
neg[x][id] += pos[y][i + p[y]];
if(neg[x][id] == 0) {
cnt[x]++;
neg[x].pop_back();
} else if(neg[x][id] > 0) {
pos[x].pb(neg[x][id]);
neg[x].pop_back();
}
}
}
}
int g = (s[x] == '0') - (s[x] == '1');
if(g > 0) pos[x].pb(g);
else neg[x].pb(g);
ans[x] = sz[x];
for(int i : neg[x]) ans[x] += i;
if(SZ(G[x]) == 0) dep[x] = 1;
};
dfs(1);
for(int i = 1; i <= n; i++) {
cout << ans[i] << " \n"[i == n];
}
}
signed main() {
freopen("data.in", "r", stdin);
freopen("my.out", "w", stdout);
atexit([](){cerr << "time: " << (db)clock()/CLOCKS_PER_SEC << "s\n";});
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while(t--) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Dangerous Syscalls
input:
2 9 101011110 1 1 3 3 3 6 2 2 4 1011 1 1 3