Submission #754361

#TimeUsernameProblemLanguageResultExecution timeMemory
754361TimDeeRegions (IOI09_regions)C++17
85 / 100
8084 ms131072 KiB
#include <bits/stdc++.h> using namespace std; //#define int long long #define forn(i,n) for(int i=0;i<n;++i) #define pi pair<int,int> #define f first #define s second #define pb push_back #define all(x) x.begin(),x.end() #define vii(a,n) vector<int>a(n);forn(i,n)cin>>a[i]; const int inf=1e18; const int K=250; const int N=2e5+55; const int M=25555; int L[N],R[N]; int dp1[N/K][M]; const int sz=1<<18; struct sgt { sgt *L, *R; int s; sgt() { L=R=NULL; s=0; } void add(int l, int r, int i) { s++; if (r-l==1) return; int m=(l+r)>>1; if (i<m) { if (!L) L=new sgt(); L->add(l,m,i); } else { if (!R) R=new sgt(); R->add(m,r,i); } } void add(int i) { add(0,sz,i); } int query(int l, int r, int lx, int rx) { if (rx<=l || r<=lx) return 0; if (lx<=l && r<=rx) return s; int m=(l+r)>>1; int lq=L?L->query(l,m,lx,rx):0; int rq=R?R->query(m,r,lx,rx):0; return lq+rq; } int query(int l, int r) { return query(0,sz,l,r); } }; vector<int> adj[N]; sgt st[N]; int reg[N]; int t=0; void dfs(int u, int p) { L[u]=t++; R[u]=L[u]; for(auto&v:adj[u]) { if (v==p) continue; dfs(v,u); R[u]=max(R[u],R[v]); } } vector<int> pos[M]; int comp[M]; int cnt[M]; void dfs(int u, int p, int c, int x) { c+=reg[u]==x; dp1[comp[x]][reg[u]]+=c; for(auto&v:adj[u]) { if (v==p) continue; dfs(v,u,c,x); } } void solve() { int n,r,q; cin>>n>>r>>q; forn(i,r) comp[i]=-1; cin>>reg[0]; --reg[0]; forn(i,n-1) { int p,r; cin>>p>>r; --p, --r; adj[p].pb(i+1); reg[i+1]=r; } dfs(0,-1); forn(i,n) st[reg[i]].add(L[i]); forn(i,n) { cnt[reg[i]]++; pos[reg[i]].pb(i); } int z=0; forn(i,r) { if (cnt[i]<=K) continue; comp[i]=z++; dfs(0,-1,0,i); } forn(i,q) { int r1, r2; cin>>r1>>r2; --r1, --r2; if (cnt[r1]<=K) { int ans=0; for(auto&x:pos[r1]) { ans+=st[r2].query(L[x],R[x]+1); } cout<<ans<<'\n'; } else { cout<<dp1[comp[r1]][r2]<<'\n'; } cout.flush(); } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); }

Compilation message (stderr)

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