Submission #753756

#TimeUsernameProblemLanguageResultExecution timeMemory
753756taherRegions (IOI09_regions)C++17
100 / 100
3224 ms44008 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "C:\GCC\debug.h" #else #define debug(...) void(42) #endif const int R = 25005; map<int, int> done[R]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, r, q; cin >> n >> r >> q; vector<vector<int>> at(r); vector<vector<int>> adj(n); int hRegion; cin >> hRegion; hRegion--; at[hRegion].push_back(0); for (int i = 1; i < n; i++) { int par, hCurrent; cin >> par >> hCurrent; --par; --hCurrent; at[hCurrent].push_back(i); adj[par].push_back(i); } vector<int> euler_tour; vector<int> in(n); vector<int> out(n); function<void(int)> Dfs = [&](int u) { in[u] = (int) euler_tour.size(); euler_tour.push_back(u); for (auto v : adj[u]) { Dfs(v); } out[u] = (int) euler_tour.size() - 1; }; Dfs(0); vector<vector<int>> all(r); vector<vector<array<int, 2>>> inters(r); for (int y = 0; y < r; y++) { for (auto pt : at[y]) { all[y].push_back(in[pt]); inters[y].push_back({in[pt], +1}); inters[y].push_back({out[pt], -1}); } sort(all[y].begin(), all[y].end()); sort(inters[y].begin(), inters[y].end()); } auto Get = [&](int x, int y) { int ptr = 0; int cnt = 0; int res = 0; for (int i = 0; i < (int) all[y].size(); i++) { while (ptr < (int) inters[x].size() && inters[x][ptr][0] < all[y][i]) { cnt += inters[x][ptr][1]; ++ptr; } res += cnt; } return res; }; for (int i = 0; i < q; i++) { array<int, 2> b; cin >> b[0] >> b[1]; --b[0], --b[1]; if (done[b[0]].count(b[1])) { cout << done[b[0]][b[1]] << '\n'; } else { int res = Get(b[0], b[1]); done[b[0]][b[1]] = res; cout << res << '\n'; } cout.flush(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...