Submission #1276785

#TimeUsernameProblemLanguageResultExecution timeMemory
1276785g4yuhgSynchronization (JOI13_synchronization)C++20
100 / 100
315 ms19064 KiB
//Huyduocdithitp #include<bits/stdc++.h> typedef int ll; #define endl '\n' #define fi first #define se second #define pii pair<ll, ll> #define N 200005 using namespace std; const ll inf = 1e9; bool ghuy4g; vector<ll> adj[N]; pii canh[N]; ll n, m, q, par[N], st[4 * N]; ll sz[N], pos[N], tour[N], chain_head[N], chain_id[N], high[N]; ll cur_pos = 1, cur_chain = 1; void update(ll id, ll l, ll r, ll i, ll v) { if (i > r || i < l) return; if (l == r) { st[id] = v; return; } ll mid = (l + r) / 2; update(id * 2, l, mid, i, v); update(id * 2 + 1, mid + 1, r, i, v); st[id] = max(st[id * 2], st[id * 2 + 1]); } ll get(ll id, ll l, ll r, ll L, ll R) { if (l > R || r < L) return -inf; if (L <= l && r <= R) { return st[id]; } ll mid = (l + r) / 2; return max(get(id * 2, l, mid, L, R), get(id * 2 + 1, mid + 1, r, L, R)); } void dfs(ll u, ll parent) { sz[u] = 1; for (auto v : adj[u]) { if (v == parent) continue; par[v] = u; high[v] = high[u] + 1; dfs(v, u); sz[u] += sz[v]; } } ll lca(ll u, ll v) { while (chain_id[u] != chain_id[v]) { //cout << u << " " << v << " " << chain_id[u] << " " << chain_id[v] << endl; //cout << chain_head[chain_id[u]] << " " << chain_head[chain_id[v]] << endl; if (high[chain_head[chain_id[u]]] > high[chain_head[chain_id[v]]]) { u = par[chain_head[chain_id[u]]]; } else { v = par[chain_head[chain_id[v]]]; } } if (high[u] < high[v]) return u; return v; } ll qr(ll u, ll v) { //return 1; ll res = -inf; ll x = lca(u, v); //return 1; while (chain_id[u] != chain_id[x]) { ll r = chain_head[chain_id[u]]; res = max(res, get(1, 1, n, pos[r], pos[u])); u = par[r]; } while (chain_id[v] != chain_id[x]) { ll r = chain_head[chain_id[v]]; res = max(res, get(1, 1, n, pos[r], pos[v])); v = par[r]; } if (high[u] < high[v]) { res = max(res, get(1, 1, n, pos[u], pos[v])); } else { res = max(res, get(1, 1, n, pos[v], pos[u])); } return res; } void hld(ll u, ll parent) { if (chain_head[cur_chain] == 0) { //cout << "head " << chain_id[u] << " " << u << endl; chain_head[cur_chain] = u; } pos[u] = cur_pos; tour[cur_pos] = u; chain_id[u] = cur_chain; //cout << u << " chain " << cur_chain << endl; cur_pos ++ ; ll nxt = 0; for (auto v : adj[u]) { if (v == parent) continue; if (sz[v] > sz[nxt]) { nxt = v; } } if (nxt) { hld(nxt, u); } for (auto v : adj[u]) { if (v == parent || v == nxt) continue; cur_chain ++ ; hld(v, u); } } void build(ll id, ll l, ll r) { if (l == r) { st[id] = l; return; } ll mid = (l + r) / 2; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); st[id] = max(st[id * 2], st[id * 2 + 1]); } void pre() { dfs(1, 1); cur_chain = cur_pos = 1; hld(1, 1); build(1, 1, n); for (int i = 1; i <= n - 1; i ++) { if (par[canh[i].fi] == canh[i].se) { swap(canh[i].fi, canh[i].se); } } } ll find(ll u) { //cout << "find " << u << endl; ll x = qr(1, u); /*if (x != qr(u, 1)) { cout << "ngu"; exit(3); }*/ if (x == -inf) return 1; return tour[x]; } ll a[N], c[N]; bool is[N]; void solve() { for (int i = 1; i <= m; i ++) { ll id; cin >> id; ll u = canh[id].fi, v = canh[id].se; if (is[id] == 0) { // noi u v ll ru = find(u); // rv == v ll moi = a[ru] + a[v] - c[v]; //cout << u << " " << v << " ru " << ru << " " << moi << endl; update(1, 1, n, pos[v], -inf); a[ru] = moi; } else { ll ru = find(u); a[v] = c[v] = a[ru]; //cout << "go ra " << ru << " " << v << " a[v] " << a[v] << endl; update(1, 1, n, pos[v], pos[v]); } is[id] = 1 - is[id]; } for (int i = 1; i <= q; i ++) { ll u; cin >> u; cout << a[find(u)] << endl; } } bool klinh; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> q; for (int i = 1; i <= n - 1; i ++) { a[i] = 1; a[i + 1] = 1; ll u, v; cin >> u >> v; canh[i] = {u, v}; adj[u].push_back(v); adj[v].push_back(u); } pre(); solve(); cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024); 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...