QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#344991#7736. Red Black Treeucup-team173RE 0ms0kbC++203.7kb2024-03-05 22:25:422024-03-05 22:25:43

Judging History

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

  • [2024-03-05 22:25:43]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-03-05 22:25:42]
  • 提交

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;
}

详细

Test #1:

score: 0
Dangerous Syscalls

input:

2
9
101011110
1 1 3 3 3 6 2 2
4
1011
1 1 3

output:


result: