Submission #730348

#TimeUsernameProblemLanguageResultExecution timeMemory
730348NintsiChkhaidzeRegions (IOI09_regions)C++17
70 / 100
6425 ms131072 KiB
#include <bits/stdc++.h> #define f first #define s second #define pb push_back #define int long long using namespace std; const int N = 2e5+5,Bl=505; vector <int> v[N],st[25005],ynull; int r[N],tin[N],tout[N],cnt[25005],timer,id[25005]; int fen[N],B,k[25005][Bl],DP[Bl][2505]; bool big[25005]; int get(int idx){ int s=0; while(idx){ s+=fen[idx]; idx -= (idx&(-idx)); } return s; } void upd(int idx,int val){ while (idx <= 200000){ fen[idx] += val; idx += (idx & (-idx)); } } vector <int> dfs(int x,int par, vector <int> P){ tin[x] = ++timer; vector <int> vec = ynull,Pnew = ynull; if (x != 1){ for (int i=0;i<B;i++) Pnew[i] += P[i]; if (big[r[par]]) Pnew[id[r[par]] - 1]++; for (int i=0;i<B;i++) DP[i+1][r[x]] += Pnew[i]; } for (int to: v[x]) if (to != par) { vector <int> o = dfs(to,x,Pnew); for (int i = 0; i < B; i++) vec[i] += o[i]; if (big[r[to]]) vec[id[r[to]] - 1]++; } for (int i=0;i<B;i++) k[r[x]][i + 1] += vec[i]; tout[x] = timer; return vec; } signed main (){ ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL); int n,R,q; cin>>n>>R>>q; cin>>r[1]; cnt[r[1]]++; st[r[1]].pb(1); for(int i=2;i<=n;i++){ int p; cin>>p>>r[i]; cnt[r[i]]++; st[r[i]].pb(i); v[p].pb(i); v[i].pb(p); } B = 0; for (int i = 1; i <= R; i++){ if (cnt[i] > Bl){ ++B; id[i] = B; big[i] = 1; } } for (int i=0;i<B;i++) ynull.pb(0); dfs(1,1,ynull); while (q--){ int r1,r2,ans=0; cin>>r1>>r2; if (!big[r1] && !big[r2]){ for (int x: st[r2]) upd(tin[x],1); for (int x: st[r1]) ans += get(tout[x]) - get(tin[x] - 1); for (int x: st[r2]) upd(tin[x],-1); cout<<ans<<endl; }else if (big[r2]){ cout<<k[r1][id[r2]]<<endl; }else{ cout<<DP[id[r1]][r2]<<endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...