Submission #764578

#TimeUsernameProblemLanguageResultExecution timeMemory
764578NK_Synchronization (JOI13_synchronization)C++17
0 / 100
1979 ms15536 KiB
// Success consists of going from failure to failure without loss of enthusiasm #include <bits/stdc++.h> using namespace std; #define nl '\n' #define pb push_back #define sz(x) int(x.size()) template<class T> using V = vector<T>; template<class T, size_t SZ> using AR = array<T, SZ>; struct DSU { V<int> e, ans; V<AR<int, 2>> last; V<AR<int, 5>> his; void init(int N) { e = V<int>(N, -1); ans = V<int>(N, 1); last = V<AR<int, 2>>(N, {0, 0}); his = {}; } int get(int x) { return e[x] < 0 ? x : get(e[x]); } int info(int x) { return ans[get(x)]; } void upd(int x, int y, int i) { int dx = ans[y] - last[i][0]; int dy = ans[x] - last[i][1]; ans[x] += dx, ans[y] += dy; last[i] = {ans[x], ans[y]}; } void unite(int x, int y, int i) { x = get(x), y = get(y); assert(x != y); upd(x, y, i); if (e[x] > e[y]) swap(x, y); his.pb({x, e[x], y, e[y], i}); e[x] += e[y]; e[y] = x; } int rollback() { if (sz(his) == 0) return -1; auto [x, ex, y, ey, i] = his.back(); his.pop_back(); e[x] = ex, e[y] = ey; upd(x, y, i); return i; } }; const int BLK = 500; const int INF = int(1e9) + 10; int main() { cin.tie(0)->sync_with_stdio(0); int N, M, Q; cin >> N >> M >> Q; V<AR<int, 2>> E(N-1); for(int e = 0; e < N-1; e++) { int u, v; cin >> u >> v; --u, --v; E[e] = {u, v}; } DSU D; D.init(N); V<V<AR<int, 2>>> EV(N); V<int> T(M); for(int i = 0; i < M; i++) { int x; cin >> x; --x; T[i] = x; // cout << x << " " << sz(EV[x]) << endl; EV[x].pb({i, sz(EV[x]) % 2}); } for(int i = 0; i < N; i++) { EV[i].pb({INF + i, -1}); reverse(begin(EV[i]), end(EV[i])); } V<int> ed; set<int> ex; auto rebuild = [&]() { ed = {}; while(1) { int r = D.rollback(); if (r == -1) break; else ed.pb(r); } sort(begin(ed), end(ed), [&](int x, int y) { return EV[x].back()[0] < EV[y].back()[0]; }); // cout << "FIRST: " << ed[0] << endl; reverse(begin(ed), end(ed)); for(const auto &e : ed) D.unite(E[e][0], E[e][1], e); }; auto rem = [&](int x) { ed = {}; while(1) { int r = D.rollback(); if (r == x) break; else ed.pb(r); } if (x != -1) { cout << sz(ed) << endl; } for(const auto &e : ed) D.unite(E[e][0], E[e][1], e); }; for(int i = 0; i < M; i++) { int e = T[i], t = EV[e].back()[1]; EV[e].pop_back(); // cout << "EX: " << ex << endl; if (t == 0) { ex.insert(e); D.unite(E[e][0], E[e][1], e); // cout << "ADD: " << e << endl; } else { rem(e); if (ex.find(e) != ex.end()) ex.erase(e); } if (sz(ex) >= BLK) { rebuild(); ex = {}; } } rem(-1); while(Q--) { int u; cin >> u; --u; cout << D.ans[u] << nl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...