Submission #872519

#TimeUsernameProblemLanguageResultExecution timeMemory
872519overwatch9Regions (IOI09_regions)C++17
100 / 100
3982 ms66764 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int maxn = 2e5 + 10; const int maxr = 25000 + 10; vector <int> adj[maxn]; int region[maxn]; vector <int> region_members[maxr]; int visit[maxn], finish[maxn]; int n, r, q, t = 0; void dfs(int s) { visit[s] = t++; for (auto i : adj[s]) dfs(i); finish[s] = t++; } vector <vector <int>> r1r2, cnt; int big_region_cnt = 0; int big_id[maxn]; void dfs2(int s, int p) { int id1 = big_id[region[s]]; int id2 = big_id[region[p]]; cnt[s] = cnt[p]; if (id2 != -1 && s != p) cnt[s][id2]++; if (id1 != -1) { for (int i = 0; i < big_region_cnt; i++) r1r2[i][id1] += cnt[s][i]; } for (auto i : adj[s]) dfs2(i, s); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); cin >> n >> r >> q; cin >> region[1]; region_members[region[1]].push_back(1); for (int i = 2; i <= n; i++) { int x; cin >> x; adj[x].push_back(i); cin >> region[i]; region_members[region[i]].push_back(i); } dfs(1); vector <vector <int>> starts(r+1); for (int i = 1; i <= r; i++) { for (auto j : region_members[i]) starts[i].push_back(visit[j]); sort(starts[i].begin(), starts[i].end()); } fill(big_id, big_id + maxn, -1); for (int i = 1; i <= r; i++) { if (region_members[i].size() > 500) big_id[i] = big_region_cnt++; } r1r2 = vector <vector <int>> (big_region_cnt + 10, vector <int> (big_region_cnt + 10)); cnt = vector <vector <int>> (n+1, vector <int> (big_region_cnt + 10)); dfs2(1, 1); while (q--) { int r1, r2; cin >> r1 >> r2; if (region_members[r1].size() <= 500) { // small int ans = 0; for (auto i : region_members[r1]) { auto l = upper_bound(starts[r2].begin(), starts[r2].end(), visit[i]) - starts[r2].begin(); auto r = upper_bound(starts[r2].begin(), starts[r2].end(), finish[i]) - starts[r2].begin(); ans += max(0, (int)(r - l)); } cout << ans << endl; } else if (region_members[r2].size() <= 500) { // small int ans = 0; for (auto i : region_members[r2]) { ans += cnt[i][big_id[r1]]; } cout << ans << endl; } else { cout << r1r2[big_id[r1]][big_id[r2]] << endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...