Submission #1287569

#TimeUsernameProblemLanguageResultExecution timeMemory
1287569nguyenkhangninh99Synchronization (JOI13_synchronization)C++20
100 / 100
562 ms31080 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 1e5 + 5, LG = 18; int up[LG][maxn], tin[maxn], out[maxn], timedfs; vector<int> g[maxn]; void dfs(int u){ tin[u] = ++timedfs; for(int v: g[u]){ if(v == up[0][u]) continue; up[0][v] = u; for(int i = 1; i < LG; i++) up[i][v] = up[i - 1][up[i - 1][v]]; dfs(v); } out[u] = timedfs; } int state[maxn], bit[maxn], last[maxn]; void update(int p, int val){ for(; p < maxn; p += p & -p) bit[p] += val; } int get(int p){ int res = 0; for(; p; p -= p & -p) res += bit[p]; return res; } int root(int u){ for(int i = LG - 1; i >= 0; i--){ if(up[i][u] == 0) continue; if(get(tin[u]) - get(tin[up[i][u]]) == 0) u = up[i][u]; } return u; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m, q; cin >> n >> m >> q; vector<pair<int, int>> edge(n + 1); for(int i = 2; i <= n; i++){ int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); edge[i] = {u, v}; } dfs(1); for(int i = 2; i <= n; i++){ if(edge[i].second == up[0][edge[i].first]) swap(edge[i].first, edge[i].second); update(tin[i], 1); update(out[i] + 1, -1); } vector<int> ans(n + 1,1); while(m--){ int i; cin >> i; i++; state[i] ^= 1; int u = edge[i].first, v = edge[i].second; if(state[i] == 1){ update(tin[v], -1); update(out[v] + 1, 1); ans[root(u)] += ans[v] - last[v]; }else{ update(tin[v], 1); update(out[v] + 1, -1); last[v] = ans[v] = ans[root(u)]; } } while(q--){ int x; cin >> x; cout << ans[root(x)] << "\n"; } 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...