Submission #171414

#TimeUsernameProblemLanguageResultExecution timeMemory
171414kuroni동기화 (JOI13_synchronization)C++17
50 / 100
8071 ms19612 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1E5 + 5, M = 2E5 + 5; int n, m, q, d, u, f[N], g[N], ue[N], ve[N], lz[N], col[N]; int que[M]; bool chk[N], mod[N]; vector<int> adj[N], com[N]; void init() { for (int i = 1; i <= n; i++) { lz[i] = col[i] = 0; mod[i] = false; adj[i].clear(); com[i].clear(); } } void DFS(int u, int p = 0) { col[u] = col[p]; for (int &v : adj[u]) { int c = u ^ ue[v] ^ ve[v]; if (c != p) { DFS(c, u); } } } void update(int u, int dif, int p = 0) { f[u] += dif; lz[u] += dif; for (int &v : com[u]) { int c = u ^ col[ue[v]] ^ col[ve[v]]; if (!chk[v]) { g[v] += dif; } else if (c != p) { update(c, dif, u); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> q; fill(f + 1, f + n + 1, 1); for (int i = 1; i < n; i++) { cin >> ue[i] >> ve[i]; g[i] = 2; } for (int i = 1; i <= m; i++) { cin >> que[i]; } d = sqrt(m / 4 + 1); for (int bl = 1; bl <= m; bl += d) { init(); for (int i = 0; i < d && bl + i <= m; i++) { mod[que[bl + i]] = true; } for (int i = 1; i < n; i++) { if (!mod[i] && chk[i]) { adj[ue[i]].push_back(i); adj[ve[i]].push_back(i); } } for (int i = 1; i <= n; i++) { if (col[i] == 0) { col[0] = i; DFS(i); } } for (int i = 1; i < n; i++) { if (mod[i]) { com[col[ue[i]]].push_back(i); com[col[ve[i]]].push_back(i); } } for (int i = 0; i < d && bl + i <= m; i++) { int e = que[bl + i]; if (!chk[e]) { int sum = (f[col[ue[e]]] + f[col[ve[e]]] + g[e]) / 2; update(col[ue[e]], sum - f[col[ue[e]]]); update(col[ve[e]], sum - f[col[ve[e]]]); g[e] = 0; } chk[e] = !chk[e]; } for (int i = 1; i <= n; i++) { f[i] = f[col[i]]; } for (int i = 1; i < n; i++) { if (!mod[i] && !chk[i]) { g[i] += lz[col[ue[i]]] + lz[col[ve[i]]]; } } } while (q--) { cin >> u; cout << f[u] << '\n'; } }
#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...