Submission #597570

#TimeUsernameProblemLanguageResultExecution timeMemory
597570MilosMilutinovicRegions (IOI09_regions)C++14
100 / 100
7976 ms40404 KiB
/** * author: wxhtzdy * created: 16.07.2022 11:38:01 **/ #include <bits/stdc++.h> using namespace std; const int BLOCK = 1000; const int MAX_T = 200005 / BLOCK; const int MAX_R = 25005; int U[MAX_T][MAX_R]; int D[MAX_T][MAX_R]; int cnt[MAX_R]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, r, q; cin >> n >> r >> q; vector<vector<int>> g(n); vector<int> reg(n); for (int i = 0; i < n; i++) { if (i > 0) { int p; cin >> p; --p; g[p].push_back(i); } cin >> reg[i]; --reg[i]; } vector<int> cc(r); for (int i = 0; i < n; i++) { cc[reg[i]] += 1; } vector<bool> h(r); vector<int> id(r); vector<int> xs; int T = 0; for (int i = 0; i < r; i++) { if (cc[i] >= BLOCK) { h[i] = true; id[i] = ++T; xs.push_back(i); } } for (int i = 0; i <= T; i++) { for (int j = 0; j < r; j++) { U[i][j] = D[i][j] = 0; } } vector<vector<pair<int, int>>> ev(r); vector<vector<int>> my(r); function<void(int)> Dfs = [&](int v) { if (h[reg[v]]) { for (int i = 0; i < r; i++) { U[id[reg[v]]][i] += cnt[i]; } } for (int i : xs) { D[id[i]][reg[v]] += cnt[i]; } cnt[reg[v]] += 1; ++T; ev[reg[v]].emplace_back(T - 1, -1); my[reg[v]].push_back(T); for (int u : g[v]) { Dfs(u); } ev[reg[v]].emplace_back(T, +1); cnt[reg[v]] -= 1; }; Dfs(0); while (q--) { int r1, r2; cin >> r1 >> r2; --r1; --r2; if (h[r1]) { cout << D[id[r1]][r2] << endl; } else if (h[r2]) { cout << U[id[r2]][r1] << endl; } else { int ptr = 0; long long ans = 0; for (int i = 0; i < (int) ev[r1].size(); i++) { while (ptr < (int) my[r2].size() && my[r2][ptr] <= ev[r1][i].first) { ptr += 1; } ans += ptr * ev[r1][i].second; } cout << ans << endl; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...