제출 #524195

#제출 시각아이디문제언어결과실행 시간메모리
524195keertanRegions (IOI09_regions)C++17
60 / 100
2574 ms96832 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<vector<int>> adj(N); vector<int> ctin[N],ctout[N],col[25001]; map<pair<int,int>,int> mp; 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<<" "; ans+=lower_bound(all(ctin[p]),tin[it])-ctin[p].begin(); ans-=upper_bound(all(ctout[p]),tin[it])-ctout[p].begin(); } 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; cin>>c[1]; for (int i=2,x,p;i<=n;i++){ cin>>p>>x; c[i]=x; adj[p].push_back(i); } dfs(1); for (int i=1;i<=r;i++){ if (sz(col[i])>=400){ 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[{i,euler[j]}]+=ok[j]-!!(euler[j]==i); } } } } for (int r,r1;q;q--){ cin>>r>>r1; if (sz(col[r])>=512){cout<<mp[{r,r1}]<<endl;continue;} else{ int ans=0; //cerr<<"gh"; //cout<<tin[1]<<" "<<tout[1]<<"\n"; for (const int& it:col[r]){ ans+=upper_bound(all(ctin[r1]),tout[it])-ctin[r1].begin(); ans-=upper_bound(all(ctin[r1]),tin[it])-ctin[r1].begin(); } cout<<ans<<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...