(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #366465

#TimeUsernameProblemLanguageResultExecution timeMemory
366465idk321Synchronization (JOI13_synchronization)C++11
100 / 100
451 ms25080 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100005; vector<int> adj[N]; array<int, 2> edge[N]; int timer = 0; int tin[N]; int tout[N]; int anc[N][20]; int info[N]; int bit[N]; void addNum(int pos, int num) { for (int i = pos; i < N; i = i | (i + 1)) bit[i] += num; } int getSum(int pos) { int sum = 0; for (int i = pos; i >= 0; i = (i &(i + 1)) - 1 ) sum += bit[i]; return sum; } void dfs(int node, int par) { tin[node] = timer; timer++; anc[node][0] = par; for (int i = 1; i < 20; i++) { if (anc[node][i - 1] == -1) { anc[node][i] = -1; } else { anc[node][i] = anc[anc[node][i - 1]][i - 1]; } } for (int next : adj[node]) { if (next == par) continue; dfs(next, node); } tout[node] = timer; } int getRoot(int node) { for (int i = 19; i >= 0; i--) { if (anc[node][i] != -1 && getSum(tin[anc[node][i]]) == getSum(tin[node])) node = anc[node][i]; } return node; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; edge[i] = {x, y}; adj[x].push_back(y); adj[y].push_back(x); } dfs(1, -1); vector<int> change(m); for (int i = 0; i < m; i++) cin >> change[i]; bool exist[N] = {}; int passed[N] = {}; for (int i = 1; i <= n; i++) { info[i] = 1; addNum(tin[i], 1); addNum(tout[i], -1); } for (int i = 0; i < m; i++) { int e = change[i]; int a = edge[e][0]; int b = edge[e][1]; if (anc[a][0] == b) swap(a, b); if (exist[e]) { a = getRoot(a); info[b] = info[a]; passed[e] = info[a]; addNum(tin[b], 1); addNum(tout[b], -1); } else { a = getRoot(a); b = getRoot(b); info[a] = info[b] + info[a] - passed[e]; info[b] = 0; passed[e] = info[b] + info[a] - passed[e]; addNum(tin[b], -1); addNum(tout[b], 1); } exist[e] = !exist[e]; } for (int q1 = 0; q1 < q; q1++) { int c; cin >> c; c = getRoot(c); cout << info[c] << "\n"; } } /* 5 6 3 1 2 1 3 2 4 2 5 1 2 1 4 4 3 1 4 5 */
#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...