Submission #996291

#TimeUsernameProblemLanguageResultExecution timeMemory
996291phoenixRegions (IOI09_regions)C++17
55 / 100
3911 ms63556 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 200200; const int R = 25025; const int B = 1080; int T; int tin[N]; int tout[N]; vector<int> g[N]; int rg[N]; int m; vector<int> heavy; vector<int> ver[R]; vector<int> seg[R]; void precalc(int s) { tin[s] = ++T; seg[rg[s]].push_back(tin[s]); for (int to : g[s]) precalc(to); tout[s] = ++T; } vector<vector<ll>> heavy_ans; vector<ll> light_ans[N]; int lst[R]; int cnt[N]; bool isheavy(int r) { return ((int)seg[r].size() > B); } void dfs(int s) { for (int i = 0; i < m; i++) { int c = heavy[i]; heavy_ans[i][c] += cnt[lst[c]]; } int x = lst[rg[s]]; cnt[s] = cnt[lst[rg[s]]] + 1; lst[rg[s]] = s; light_ans[s].resize(m); if (isheavy(rg[s])) { int c = lower_bound(heavy.begin(), heavy.end(), rg[s]) - heavy.begin(); light_ans[s][c]++; } for (int to : g[s]) { dfs(to); for (int i = 0; i < m; i++) light_ans[s][i] += light_ans[to][i]; } lst[rg[s]] = x; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, regions, q; cin >> n >> regions >> q; for (int i = 1; i <= n; i++) { int p; if (i > 1) { cin >> p; g[p].push_back(i); } cin >> rg[i]; ver[rg[i]].push_back(i); } precalc(1); for (int i = 1; i <= regions; i++) { if (isheavy(i)) { heavy.push_back(i); heavy_ans.push_back(vector<ll>(regions + 1)); m++; } sort(seg[i].begin(), seg[i].end()); } dfs(1); while (q--) { int r1, r2; cin >> r1 >> r2; int ans = 0; if (isheavy(r1)) { int c = lower_bound(heavy.begin(), heavy.end(), r1) - heavy.begin(); ans = heavy_ans[c][r2]; } else if (isheavy(r2)) { int c = lower_bound(heavy.begin(), heavy.end(), r2) - heavy.begin(); for (int v : ver[r1]) { ans += light_ans[v][c]; } } else { for (int v : ver[r1]) { int l, r; l = upper_bound(seg[r2].begin(), seg[r2].end(), tin[v]) - seg[r2].begin(); r = upper_bound(seg[r2].begin(), seg[r2].end(), tout[v]) - seg[r2].begin(); ans += max(r - l, 0); } } cout << ans << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...