Submission #516496

#TimeUsernameProblemLanguageResultExecution timeMemory
516496blueRegions (IOI09_regions)C++17
30 / 100
1165 ms37268 KiB
#include <iostream> #include <algorithm> #include <vector> using namespace std; using ll = long long; using vi = vector<int>; using vvi = vector<vi>; using vl = vector<ll>; using vvl = vector<vl>; #define sz(x) int(x.size()) const int maxN = 200'000; const int maxR = 500; const int mns = 1; const int maxL = 1 + maxR/mns; int N, R, Q; vi H(1+maxN); vi S(1+maxN); vi children[1+maxN]; vi region_list[1+maxR]; vi norm(1+maxR, 0); int large_ct = 0; vvl large_bottom(1+maxL, vl(1 + maxR)); vvl large_top(1+maxL, vl(1 + maxR)); vi inc(1+maxL, 0); vi dfs_order(1, 0); vi order_index(1+maxN); int dfs_ct = 0; vi subtree(1+maxN, 1); void dfs(int u) { dfs_order.push_back(u); order_index[u] = ++dfs_ct; for(int l = 1; l <= large_ct; l++) large_top[l][H[u]] += inc[l]; if(norm[H[u]]) inc[norm[H[u]]]++; for(int v: children[u]) { dfs(v); subtree[u] += subtree[v]; } if(norm[H[u]]) inc[norm[H[u]]]--; } int main() { // cout << "done\n"; ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> N >> R >> Q; cin >> H[1]; S[1] = 0; for(int i = 2; i <= N; i++) { cin >> S[i] >> H[i]; children[S[i]].push_back(i); } for(int i = 1; i <= N; i++) { region_list[ H[i] ].push_back(i); } for(int r = 1; r <= R; r++) { if(sz(region_list[r]) >= mns) { norm[r] = ++large_ct; } } dfs(1); vi pos_list[1+N], neg_list[1+N]; for(int u = 1; u <= N; u++) { neg_list[order_index[u] - 1].push_back(H[u]); pos_list[order_index[u] + subtree[u] - 1].push_back(H[u]); } // for(int u: dfs_order) cerr << u << ' '; // cerr << '\n'; // for(int r = 1; r <= R; r++) // { // cerr << "r = " << r << " : "; // for(int i = 1; i <= N) // } inc = vi(1+large_ct, 0); for(int i = 0; i <= N; i++) { if(norm[H[dfs_order[i]]]) inc[ norm[H[dfs_order[i]]] ]++; for(int j: neg_list[i]) for(int l = 1; l <= large_ct; l++) large_bottom[l][j] -= inc[l]; for(int j: pos_list[i]) for(int l = 1; l <= large_ct; l++) large_bottom[l][j] += inc[l]; // cerr << "i = " << i << ": " << dfs_order[i] << " \n"; // for(int r = 1; r <= R; r++) cerr << inc[r] << ' '; // cerr << '\n'; } for(int q = 1; q <= Q; q++) { int r1, r2; cin >> r1 >> r2; cout << large_bottom[norm[r2]][r1] << '\n'; cout.flush(); } return 0; // int r1, r2; // cin >> r1 >> r2; // cout << large_top[norm[r1]][r2] << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...