Submission #1224876

#TimeUsernameProblemLanguageResultExecution timeMemory
1224876rcllRegions (IOI09_regions)C++20
100 / 100
2999 ms34668 KiB
#include <bits/stdc++.h> using namespace std; int main() { int n,r,q; cin >> n >> r >> q; vector<int> region(n); cin >> region[0]; region[0]--; vector<vector<int>> adj(n); for (int i=1; i<n; i++) { int p,h; cin >> p >> h; p--,h--; adj[p].push_back(i); region[i]=h; } vector<int> tin(n); vector<int> tout(n); vector<int> tin_node(n); vector<vector<int>> comp(r); int timer=0; function<void(int)> tour=[&](int u) -> void { tin[u]=timer++; tin_node[tin[u]]=u; comp[region[u]].push_back(tin[u]); for (int v : adj[u]) { tour(v); } tout[u]=timer; }; tour(0); const int BLOCK=sqrt(n); vector<vector<int>> calc; vector<int> region_id(r,-1); function<void(int,int,int)> dfs=[&](int u,int parent_region, int parent_count) -> void { if (region[u] == parent_region) { parent_count++; } calc[region_id[parent_region]][region[u]] += parent_count; for (int v : adj[u]) { dfs(v,parent_region,parent_count); } }; int current_id=0; for (int i=0; i<r; i++) { if ((int)comp[i].size() >= BLOCK) { region_id[i]=current_id++; calc.push_back(vector<int>(r)); dfs(0,i,0); } } for (int i=0; i<q; i++) { int e1,e2; cin >> e1 >> e2; e1--,e2--; if ((int)comp[e1].size() >= BLOCK) { cout << calc[region_id[e1]][e2] << '\n'; } else { int total=0; for (int u : comp[e1]) { total += lower_bound(begin(comp[e2]),end(comp[e2]),tout[tin_node[u]]) - lower_bound(begin(comp[e2]),end(comp[e2]),tin[tin_node[u]]); } cout << total << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...