제출 #627339

#제출 시각아이디문제언어결과실행 시간메모리
627339clamsRegions (IOI09_regions)C++17
55 / 100
8095 ms34632 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5; const int R = 25e3 + 5; const int Q = 2e5 + 5; const int R1 = 505; int n, r, q; int home[N], par[N]; vector<int> adj[N]; vector<int> reg[R]; namespace sub1 { map<int, int> mp[N]; int pre[R1][R1]; void dfs(int u, int p) { for (int v : adj[u]) { if (v == p) continue; dfs(v, u); if (mp[u].size() < mp[v].size()) swap(mp[u], mp[v]); for (auto i : mp[v]) mp[u][i.first] += i.second; } for (auto i : mp[u]) { pre[home[u]][i.first] += i.second; } mp[u][home[u]]++; } void solve() { dfs(1, 0); while (q--) { int r1, r2; cin >> r1 >> r2; cout << pre[r1][r2] << endl; } } } namespace sub2 { int tin[N], tout[N], timer = 0; void dfs(int u, int p) { tin[u] = ++timer; for (int v : adj[u]) { if (v == p) continue; dfs(v, u); } tout[u] = timer; } bool ischild(int i, int j) { return tin[i] <= tin[j] && tout[j] <= tout[i]; } void solve() { dfs(1, 0); while (q--) { int r1, r2; cin >> r1 >> r2; int ans = 0; for (int i : reg[r1]) { for (int j : reg[r2]) { ans += (i != j && ischild(i, j)); } } cout << ans << endl; } } } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> r >> q; cin >> home[1]; reg[home[1]].push_back(1); for (int i = 2; i <= n; i++) { cin >> par[i] >> home[i]; adj[par[i]].push_back(i); adj[i].push_back(par[i]); reg[home[i]].push_back(i); } if (r < R1) { sub1::solve(); } else { sub2::solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...