Submission #1042853

#TimeUsernameProblemLanguageResultExecution timeMemory
1042853ThommyDBRegions (IOI09_regions)C++17
100 / 100
3110 ms25764 KiB
#include<bits/stdc++.h> using namespace std; int n, r, q; vector<int> home, rid; vector<vector<int>> reverse_super, conn, tot; vector<pair<pair<int, int>, int>> euler; int timer = 0; void euler_tour(int at) { euler[at].first.first = timer; euler[timer].second = at; conn[home[at]].push_back(timer); timer++; for (int u : reverse_super[at]) { euler_tour(u); } euler[at].first.second = timer; } void dfs(int x, int parreg, int parc){ if(home[x]==parreg){ parc++; } tot[rid[parreg]][home[x]]+=parc; for(auto u : reverse_super[x]) dfs(u, parreg, parc); } signed main(){ cin >> n >> r >> q; home.resize(n+1); reverse_super.resize(n+1); euler.resize(n+1); conn.resize(r+1); rid.resize(r+1); cin >> home[0]; home[0]--; for(int i = 1; i < n; i++){ int super; cin >> super >> home[i];super--; home[i]--; reverse_super[super].push_back(i); } euler_tour(0); int a=0; for(int i=0;i<r;i++){ if(conn[i].size()>1000){ rid[i]=a; a++; tot.push_back(vector<int>(r)); dfs(0, i, 0); } } int r1, r2; for(int i = 0; i < q; i++){ cin >> r1 >> r2;r1--;r2--; if(conn[r1].size()>1000){ cout << tot[rid[r1]][r2] << "\n"; continue; } int ans = 0; for(auto u : conn[r1]){ ans +=lower_bound(conn[r2].begin(), conn[r2].end(), euler[euler[u].second].first.second) -lower_bound(conn[r2].begin(), conn[r2].end(), euler[euler[u].second].first.first); } cout << ans << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...