Submission #1189310

#TimeUsernameProblemLanguageResultExecution timeMemory
1189310akamizaneRegions (IOI09_regions)C++17
0 / 100
307 ms45124 KiB
#include<bits/stdc++.h> using namespace std; #define debug(...) 42 #define int long long using ll = long long; int timeDfs = 0; vector<int> a, tin, tout, ord, id; vector<vector<int>> calc, ad, comp; void tour(int u){ tin[u] = timeDfs++; ord[tin[u]] = u; comp[a[u]].push_back(tin[u]); for (auto v : ad[u]) tour(v); tout[u] = timeDfs; } void dfs(int u, int par_reg, int par_cnt){ if (a[u] == par_reg) par_cnt++; calc[id[par_reg]][a[u]] += par_cnt; for (auto v : ad[u]) dfs(v, par_reg, par_cnt); } void solve(){ int n, r, q; cin >> n >> r >> q; a.resize(n); ad.resize(n); tin.resize(n); tout.resize(n); ord.resize(n); comp.resize(n); id.assign(r, -1); cin >> a[0]; a[0]--; for (int i = 1; i < n; i++){ int p, h; cin >> p >> h; p--; h--; ad[p].push_back(i); a[i] = h; } for (int i = 0; i < r; i++) id[i] = -1; tour(0); int cur = 0; const int block = sqrt(n); for (int i = 0; i < r; i++){ if (comp[i].size() >= block){ id[i] = cur++; calc.push_back(vector<int> (r)); dfs(0, i, 0); } } while(q--){ int e1, e2; cin >> e1 >> e2; e1--, e2--; if (comp[e1].size() >= block){ cout << calc[id[e1]][e2] << "\n"; } else{ int ans = 0; for (auto u : comp[e1]){ ans += lower_bound(comp[e2].begin(), comp[e2].end(), tout[ord[u]]) - lower_bound(comp[e2].begin(), comp[e2].end(), tin[ord[u]]); } cout << ans << "\n"; } } } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); int tt = 1; // cin >> tt; while(tt--) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...