Submission #1213891

#TimeUsernameProblemLanguageResultExecution timeMemory
1213891vaneaRegions (IOI09_regions)C++20
0 / 100
483 ms30040 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mxN = 2e5+10; const int mxR = 3e4+10; int reg[mxN], bit[mxN]; vector<int> adj[mxN], emp[mxR]; int tin[mxN], tout[mxN], timer = 0; int ans1[510][510], cnt[mxN]; void dfs(int node, int p) { tin[node] = ++timer; for(auto it : adj[node]) { if(it == p) continue; dfs(it, node); } tout[node] = timer; } void upd(int k, int x) { for(k; k < mxN; k += ((k) & (-k))) { bit[k] += x; } } int qry(int k) { int ans = 0; for(; k >= 1; k -= ((k) & (-k))) { ans += bit[k]; } return ans; } void dfs1(int node, int p, int k) { cnt[node] = (reg[node] == k); for(auto it : adj[node]) { if(it == p) continue; dfs1(it, node, k); cnt[node] += cnt[it]; } ans1[reg[node]][k] += cnt[node]; } int main() { int n, r, q; cin >> n >> r >> q; cin >> reg[1]; emp[reg[1]].push_back(1); for(int i = 2; i <= n; i++) { int p; cin >> p >> reg[i]; emp[reg[i]].push_back(i); adj[p].push_back(i); adj[i].push_back(p); } dfs(1, 0); if(r <= 500) { for(int r1 = 1; r1 <= r; r1++) { dfs1(1, 0, r1); } } int mx = 0; vector<int> answers(q+1); vector<array<int, 2>> queries; vector<vector<array<int, 2>>> qrs(q+1); for(int i = 0; i < q; i++) { int r1, r2; cin >> r1 >> r2; queries.push_back({r1, r2}); qrs[r2].push_back({r1, i}); } for(int r2 = r; r2 >= 1; r2--) { if(qrs[r2].empty()) continue; for(auto it : emp[r2]) { upd(tin[it], 1); } for(auto [r1, idx] : qrs[r2]) { int ans = 0; for(auto it : emp[r1]) { ans += qry(tout[it]) - qry(tin[it]-1); } answers[idx] = ans; } for(auto it : emp[r2]) { upd(tin[it], -1); } } for(int i = 0; i < q; i++) { int r1 = queries[i][0], r2 = queries[i][1]; if(r <= 500) { cout << ans1[r1][r2] << '\n'; cout.flush(); continue; }/* else if(emp[r1].size() <= 500 && emp[r2].size() <= 500) { int ans = 0; for(auto it : emp[r2]) { upd(tin[it], 1); } for(auto it : emp[r1]) { ans += qry(tout[it])-qry(tin[it]-1); } for(auto it : emp[r2]) { upd(tin[it], -1); } cout << ans << '\n'; cout.flush(); }*/ else { cout << answers[i] << '\n'; cout.flush(); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...