Submission #1019485

#TimeUsernameProblemLanguageResultExecution timeMemory
1019485vjudge1Regions (IOI09_regions)C++17
90 / 100
6041 ms131072 KiB
#include<bits/stdc++.h> using namespace std; #include<bits/extc++.h> using namespace __gnu_pbds; #define N 200100 #define SZ 410 int CC,in[N],out[N],id[N],prc[SZ][SZ],hv[SZ],CC2,reg[N],ANS,T[N]; vector<int>hav[N],adj[N]; gp_hash_table<int,int> sup[SZ],sub[SZ]; void upd(gp_hash_table<int,int>&mp,int x,int v){ while(x<N) mp[x]+=v,x+=x&-x; } void query(gp_hash_table<int,int>&mp,int x,int v){ while(x) ANS+=mp[x]*v,x-=x&-x; } void upd2(int x,int v){ while(x<N) T[x]+=v,x+=x&-x; } void query2(int x,int v){ while(x) ANS+=T[x]*v,x-=x&-x; } void dfs(int n){ if(id[reg[n]])for(int i=1;i<SZ;i++) prc[i][id[reg[n]]]+=hv[i]; hv[id[reg[n]]]++; in[n]=++CC; for(auto i:adj[n])dfs(i); hv[id[reg[n]]]--; out[n]=CC; if(id[reg[n]]) upd(sup[id[reg[n]]],in[n],1), upd(sup[id[reg[n]]],out[n]+1,-1), upd(sub[id[reg[n]]],in[n],1); } int main(){ cin.tie(0)->sync_with_stdio(0); int n,q,r; cin>>n>>r>>q; cin>>reg[1]; for(int i=2;i<=n;i++){ int p;cin>>p>>reg[i]; adj[p].push_back(i); } for(int i=1;i<=n;i++) hav[reg[i]].push_back(i); for(int i=1;i<=r;i++) if(hav[i].size()>=500) id[i]=++CC2; dfs(1); while(q--){ int a,b; cin>>a>>b; ANS=0; if(id[a]&&id[b]) ANS=prc[id[a]][id[b]]; else if(id[a]||id[b]) if(hav[a].size()>hav[b].size()) for(auto i:hav[b]) query(sup[id[a]],in[i],1); else for(auto i:hav[a]) query(sub[id[b]],in[i]-1,-1), query(sub[id[b]],out[i],1); else { for(auto i:hav[a]) upd2(in[i],1), upd2(out[i]+1,-1); for(auto i:hav[b]) query2(in[i],1); for(auto i:hav[a]) upd2(in[i],-1), upd2(out[i]+1,1); } cout<<ANS<<endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...