Submission #524327

#TimeUsernameProblemLanguageResultExecution timeMemory
524327keertanRegions (IOI09_regions)C++17
0 / 100
3248 ms110196 KiB
#include <bits/stdc++.h> using namespace std; //#define int int64_t #define rep(Begin,End) for (Begin=0;Begin<(End);Begin++) #define all(x) x.begin(), x.end() #define all1(x) x.rbegin(), x.rend() #define sz(x) (int32_t)(x.size()) const int N = 3e5+4, mod =998244353; const int64_t N1=1e18; const double eps=1e-6,cmp=1e-3; int tin[N],tout[N],c[N]; int tmr=1; vector<int> adj[N]; vector<int> ctin[N],ctout[N],col[25001]; unordered_map<int,int> mp[25001]; int euler[N]; void dfs(int u){ tin[u]=tmr; euler[tmr]=c[u]; //cerr<<u<< " "<<c[u]<<"\n"; ctin[c[u]].push_back(tmr++); col[c[u]].push_back(u); for (const int& it:adj[u]){ dfs(it); } tout[u]=tmr++; ctout[c[u]].push_back(tout[u]); } int child(int p,int chld){ int ans=0; //cerr<<"chld"; for (const int& it:col[chld]){ //cerr<<it<<" "; int cur=0,cur1=0; for (int lg=(1ll<<18);lg;lg>>=1){ if (sz(ctin[p])>=cur+lg && ctin[p][cur+lg-1]<tin[it]){ cur+=lg; } if (sz(ctout[p])>=cur1+lg && ctout[p][cur1+lg-1]<=tin[it]){ cur1+=lg; } } //cerr<<cur<<" "<<cur1; ans+=cur-cur1; } return ans; } int parent(int p,int chld){ int ans=0; //cerr<<"gh"; //cout<<tin[1]<<" "<<tout[1]<<"\n"; for (const int& it:col[p]){ ans+=upper_bound(all(ctin[chld]),tout[it])-ctin[chld].begin(); ans-=upper_bound(all(ctin[chld]),tin[it])-ctin[chld].begin(); } return ans; } void solve(){ int n,r,q; cin>>n>>r>>q; vector<int>f(r+1); cin>>c[1]; f[c[1]]++; for (int i=2,x,p;i<=n;i++){ cin>>p>>x; c[i]=x; f[x]++; adj[p].push_back(i); } for (int i=0;i<=r;i++){ ctin[i].resize(f[i]+2); ctout[i].resize(f[i]+2); col[i].resize(f[i]+2); } dfs(1); for (int i=1;i<=r;i++){ if (sz(col[i])>=512){ vector<int> ok(tmr+1); for (const int& it:col[i]){ ok[tin[it]]++; ok[tout[it]]--; } for (int j=1;j<tmr;j++){ ok[j]+=ok[j-1]; if (euler[j]){ mp[euler[j]][i]+=ok[j]-!!(euler[j]==i); } } } } for (int r,r1;q;q--){ cin>>r>>r1; if (sz(col[r])>=512){cout<<mp[r1][r]<<endl;continue;} else if (sz(col[r])<sz(col[r1])){ cout<<parent(r,r1)<<endl; } else{ cout<<child(r,r1)<<endl; } } } int32_t main(){ ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr); int tq = 1; //cin>>tq; for (;tq;tq--){solve();} }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...