Submission #1316356

#TimeUsernameProblemLanguageResultExecution timeMemory
1316356wangzhiyi33Regions (IOI09_regions)C++20
95 / 100
3557 ms141628 KiB
#include <bits/stdc++.h> using namespace std; #define ii pair<int,int> #define fir first #define sec second #define pb push_back const int maxn=2e5; const int block=350; int n,r,qu,root; vector<int>adj[maxn+2]; int reg[maxn+2]; int in[maxn+2],out[maxn+2],rev[maxn+2]; int cnt; vector<int>mana[maxn+2]; void euler(int cur){ in[cur]=++cnt; rev[cnt]=cur; mana[reg[cur]].pb(cnt); for(auto x : adj[cur]){ euler(x); } out[cur]=cnt; } map<int,int>ans[maxn+2]; void dfs(int cur,int mau,int tot){ ans[mau][reg[cur]]+=tot; if(reg[cur]==mau){ tot++; } for(auto x : adj[cur]){ dfs(x,mau,tot); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>r>>qu>>reg[1]; for(int q=2;q<=n;q++){ int p; cin>>p>>reg[q]; adj[p].pb(q); } euler(1); for(int q=1;q<=n;q++){ if(mana[q].size()>=block){ dfs(1,q,0); } } while(qu--){ int a,b; cin>>a>>b; if(mana[a].size()>=block){ cout<<ans[a][b]<<endl; } else{ int tot=0; for(auto x : mana[a]){ x=rev[x]; int lst=upper_bound(mana[b].begin(),mana[b].end(),out[x])-mana[b].begin(); int mul=upper_bound(mana[b].begin(),mana[b].end(),in[x])-mana[b].begin(); tot+=(lst-mul); } cout<<tot<<endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...