Submission #647779

#TimeUsernameProblemLanguageResultExecution timeMemory
647779ymmSynchronization (JOI13_synchronization)C++17
100 / 100
295 ms42556 KiB
#include <bits/stdc++.h> #define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x) #define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x) typedef long long ll; typedef std::pair<int, int> pii; typedef std::pair<ll , ll > pll; using namespace std; const int N = 200'010; int ev[N], eu[N]; int e_last_inter[N]; int cnt_info[N]; int change[N]; int query[N]; int n, m, q; namespace dsu { int par[N], sz[N]; vector<tuple<int,int,int>> history; int root(int v) { return par[v] == -1? v: root(par[v]); } void unite(int v, int u, int e) { v = root(v); u = root(u); assert(v != u); if (sz[v] < sz[u]) swap(v, u); history.emplace_back(v, u, e); par[u] = v; sz[v] += sz[u]; cnt_info[v] = cnt_info[v] + cnt_info[u] - e_last_inter[e]; //printf("%d became child of %d, %d's cnt_info updated to %d\n", // u, v, v, cnt_info[v]); } void revert() { auto [v, u, e] = history.back(); history.pop_back(); e_last_inter[e] = cnt_info[v]; cnt_info[u] = cnt_info[v]; sz[v] -= sz[u]; par[u] = -1; //printf("%d got seperated from %d, %d's cnt_info updated to %d\n", // u, v, u, cnt_info[u]); } void init() { fill(par, par+N, -1); fill(sz, sz+N, 1); history.clear(); } } namespace dyn_con { vector<int> seg[N<<2]; void place(int l, int r, int edge, int i, int b, int e) { if (l <= b && e <= r) { seg[i].push_back(edge); return; } if (r <= b || e <= l) return; place(l,r,edge,2*i+1,b,(b+e)/2); place(l,r,edge,2*i+2,(b+e)/2,e); } void dfs(int i, int b, int e) { for (int e : seg[i]) dsu::unite(ev[e], eu[e], e); if (e-b > 1) { dfs(2*i+1,b,(b+e)/2); dfs(2*i+2,(b+e)/2,e); } for (int e : seg[i]) dsu::revert(); } } void make_dyn() { static int last[N]; memset(last, -1, sizeof(last)); Loop (i,0,m) { if (last[change[i]] == -1) { last[change[i]] = i; } else { dyn_con::place(last[change[i]], i, change[i], 0, 0, m); last[change[i]] = -1; } } Loop (i,0,n-1) { if (last[i] != -1) dyn_con::place(last[i], m, i, 0, 0, m); } } void input() { cin >> n >> m >> q; Loop (i,0,n-1) { cin >> ev[i] >> eu[i]; --ev[i]; --eu[i]; } Loop (i,0,m) { cin >> change[i]; --change[i]; } Loop (i,0,q) { cin >> query[i]; --query[i]; } } int main() { cin.tie(0) -> sync_with_stdio(false); input(); make_dyn(); dsu::init(); fill(cnt_info, cnt_info+N, 1); dyn_con::dfs(0, 0, m); Loop (i,0,q) cout << cnt_info[query[i]] << '\n'; }

Compilation message (stderr)

synchronization.cpp: In function 'void dyn_con::dfs(int, int, int)':
synchronization.cpp:81:11: warning: unused variable 'e' [-Wunused-variable]
   81 |  for (int e : seg[i])
      |           ^
#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...