Submission #896390

#TimeUsernameProblemLanguageResultExecution timeMemory
896390arashMLGRegions (IOI09_regions)C++17
100 / 100
5704 ms75568 KiB
#include<bits/stdc++.h> #ifdef LOCAL #include "Essentials/algo/debug.h" #else #define debug(...) 69 #endif using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; const int sq = 600; const int N = 2e5 + 23; const ll inf = 1e18; #define F first #define S second #define pb push_back #define kill(x) cout<<x<<endl, exit(0); #define all(x) x.begin(),x.end() #define sz(x) (int)x.size() #define lc (v << 1) #define rc ((v<<1) |1) struct custom_hash { static uint64_t splitmix64(uint64_t x) { // http://xorshift.di.unimi.it/splitmix64.c x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; struct Fen { int bit[N]; void add(int pos,int x) { for(; pos < N; pos += pos&-pos) bit[pos] += x; } void add(int l,int r,int x) { add(l,x); add(r+1,-x); } int get(int pos) { int ans=0; for(; pos > 0 ; pos -= pos&-pos) ans += bit[pos]; return ans; } } fen; int n,r,q; vector<int> G[N]; int psu[N],psd[N]; int h[N]; vector<int> com[N]; unordered_map<int,int,custom_hash> mp[N]; int st[N],ft[N]; int timer = 1; void dfsset(int v) { st[v] = timer ++; for(int u : G[v]) dfsset(u); ft[v] = timer-1; } void dfs(int v,int cur_r) { psu[v] += (h[v] == cur_r); psd[v] = (h[v] == cur_r); for(int u : G[v]) { psu[u] = psu[v]; dfs(u,cur_r); psd[v] += psd[u]; } if(sz(com[h[v]]) < sq || h[v] > cur_r) { mp[cur_r][h[v]] += psu[v]; mp[h[v]][cur_r] += psd[v]; } if(v == 1) psu[v] = psd[v] = 0; } int32_t main() { cin.tie(nullptr)->sync_with_stdio(false); cin>>n>>r>>q; for(int i = 1; i <= n ; i++) { if(i >= 2) { int p; cin>>p; G[p].pb(i); } cin>>h[i]; com[h[i]].pb(i); } dfsset(1); for(int i = 1; i<= r; i ++) { if(sz(com[i]) >= sq) { dfs(1,i); } } while(q--) { int r1,r2; cin>>r1>>r2; if(sz(com[r1]) >= sq || sz(com[r2]) >= sq){ cout<<mp[r1][r2] << endl; continue; } int ans=0; for(int x : com[r1]) { fen.add(st[x],ft[x],1); } for(int x : com[r2]) { ans += fen.get(st[x]); } for(int x : com[r1]) { fen.add(st[x],ft[x],-1); } cout<<ans << endl; } return 0; } // Jumpsuit, Jumpsuit cover me! // Jumpsuit, Jumpsuit cover me!
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...