Submission #908966

#TimeUsernameProblemLanguageResultExecution timeMemory
908966089487Regions (IOI09_regions)C++14
95 / 100
7142 ms131072 KiB
#include<bits/stdc++.h> //#define int long long #define quick ios::sync_with_stdio(0);cin.tie(0); #define rep(x,a,b) for(int x=a;x<=b;x++) #define repd(x,a,b) for(int x=a;x>=b;x--) #define lowbit(x) (x&-x) #define F first #define S second #define sz(x) (int)(x.size()) #define all(x) x.begin(),x.end() #define mp make_pair #define eb emplace_back using namespace std; typedef pair<int,int> pii; void debug(){ cout<<"\n"; } template <class T,class ... U > void debug(T a, U ... b){ cout<<a<<" ",debug(b...); } const int N=4e5+2; const int INF=1e18; const int K=500; const int K2=400; vector<int> cnt[N]; int pnt[K2][N]; int chd[K2][N]; int idx[N]; int c[N]; vector<int> v[N]; int in[N],out[N]; int t=1; void dfs(int x){ in[x]=t++; for(int i:v[x]){ dfs(i); } out[x]=t++; } void solve(int col,int _id,int x=1){ if(c[x]==col){ pnt[_id][x]+=1; chd[_id][x]+=1; } for(int i:v[x]){ chd[_id][i]+=chd[_id][x]; solve(col,_id,i); pnt[_id][x]+=pnt[_id][i]; } } int bit[N]; void add(int x,int val){ for(;x<N;x+=lowbit(x)){ bit[x]+=val; } } int qry(int x){ int ret=0; for(;x>0;x-=lowbit(x)) ret+=bit[x]; return ret; } int bruforce(int c1,int c2){ vector<pii> p1; vector<pii> p2; for(int x:cnt[c1]) p1.eb(in[x],out[x]),add(out[x],1); for(int x:cnt[c2]) p2.eb(in[x],out[x]); sort(all(p1)); sort(all(p2)); int l=0; int ans=0; rep(i,0,sz(p2)-1){ while(l<sz(p1)&&p1[l].F<=p2[i].F) { add(p1[l++].S,-1); } ans+=qry(p2[i].S); } while(l<sz(p1)) { add(p1[l++].S,-1); } return ans; } long long cntchild(int Id,int r1){ long long ans=0; for(int j:cnt[r1]){ ans+=chd[Id][j]; } return ans; } long long cntpnt(int Id,int r2){ long long ans=0; for(int j:cnt[r2]){ ans+=pnt[Id][j]; } return ans; } signed main(){ quick int n,r,q; cin>>n>>r>>q; cin>>c[1]; cnt[c[1]].eb(1); rep(i,2,n){ int p; cin>>p>>c[i]; cnt[c[i]].eb(i); v[p].eb(i); } dfs(1); int ID=0; rep(i,1,r){ if(sz(cnt[i])>=K){ idx[i]=ID++; solve(i,ID); idx[i]=ID; ID+=1; } } assert(ID<K); while(q--){ int r1,r2; cin>>r1>>r2; if(sz(cnt[r1])<K&&sz(cnt[r2])<K){ cout<<bruforce(r2,r1)<<endl; } else if(sz(cnt[r1])>sz(cnt[r2])){ cout<<cntchild(idx[r1],r2)<<endl; } else cout<<cntpnt(idx[r2],r1)<<endl; } }

Compilation message (stderr)

regions.cpp:23:15: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   23 | const int INF=1e18;
      |               ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...