제출 #1288663

#제출 시각아이디문제언어결과실행 시간메모리
1288663lightentheshadow동기화 (JOI13_synchronization)C++20
100 / 100
249 ms22216 KiB
#include <bits/stdc++.h> using namespace std; const int maxN = 1e5 + 5; vector<int> adj[maxN]; int in[maxN], out[maxN], par[20][maxN], timeDfs = 0; int ans[maxN], save[maxN], status[maxN]; pair<int, int> edge[maxN]; void preDfs(int u, int pre) { in[u] = ++timeDfs; for (auto v: adj[u]) { if (v == pre) continue; par[0][v] = u; preDfs(v, u); } out[u] = timeDfs; } int BIT[maxN]; void update(int u, int v, int n) { int idx = u; while (idx <= n) { BIT[idx] += v; idx += (idx & (-idx)); } } int getSum(int p) { int idx = p, ans = 0; while (idx > 0) { ans += BIT[idx]; idx -= (idx & (-idx)); } return ans; } int jump_to(int x) { for (int k = 16; k >= 0; k--) { if (!par[k][x]) continue; if (getSum(in[x]) - getSum(in[par[k][x]]) == (1 << k)) x = par[k][x]; } return x; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, q; cin >> n >> m >> q; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); edge[i] = {u, v}; } preDfs(1, 1); for (int i = 1; i < n; i++) if (in[edge[i].first] > in[edge[i].second]) swap(edge[i].first, edge[i].second); for (int k = 1; k <= 16; k++) for (int i = 1; i <= n; i++) par[k][i] = par[k - 1][par[k - 1][i]]; for (int i = 1; i <= n; i++) ans[i] = 1; while (m--) { int id; cin >> id; auto [u, v] = edge[id]; if (!status[id]) { update(in[v], 1, n); update(out[v] + 1, -1, n); int x = jump_to(v); ans[x] += ans[v] - save[id]; } else { int x = jump_to(v); save[id] = ans[v] = ans[x]; update(in[v], -1, n); update(out[v] + 1, 1, n); } status[id] ^= 1; } while (q--) { int x; cin >> x; cout << ans[jump_to(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...