Submission #819380

#TimeUsernameProblemLanguageResultExecution timeMemory
819380boyliguanhanSynchronization (JOI13_synchronization)C++17
100 / 100
229 ms24240 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; bool on[100100]; vector<int> adj[100100]; int ans[100100], pre[100100], cnt = 1, ti[100100], to[100100], bj[100100][20], tree[100100], E[200100][2]; void dfs(int n, int p) { bj[n][0] = p; for (int i = 1; i < 20; i++) bj[n][i] = bj[bj[n][i - 1]][i - 1]; ans[n] = 1; ti[n] = cnt++; for (int i : adj[n]) if (i-p) dfs(i, n); to[n] = cnt; } void U(int n, int val) { while(n < 100100) tree[n] += val, n+=n&-n; } int Q(int n) { int ans = 0; while(n) ans += tree[n], n-=n&-n; return ans; } int gr(int n) { int lca = n; for (int i = 20; i--;) if (Q(ti[bj[lca][i]]) == Q(ti[n])) lca = bj[lca][i]; return lca; } int main() { cin.sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; for(int i = 1; i < n; i++) { cin >> E[i][0] >> E[i][1]; adj[E[i][0]].push_back(E[i][1]); adj[E[i][1]].push_back(E[i][0]); } dfs(1,1); for(int i = 1; i < n; i++) { if(bj[E[i][0]][0]==E[i][1]) swap(E[i][0], E[i][1]); } for(int i = 1; i <= n; i++) { U(ti[i], -1); U(to[i], 1); } while (m--) { int x; cin >> x; int u = E[x][0], v = E[x][1]; if (bj[u][0] == v) swap(u, v); if (on[x]) { ans[v] = pre[v] = ans[gr(u)]; U(ti[v], -1); U(to[v], 1); } else { ans[gr(u)] += ans[v] - pre[v]; U(ti[v], 1); U(to[v], -1); } on[x] = !on[x]; } while (q--) { int x; cin >> x; cout << ans[gr(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...