제출 #477615

#제출 시각아이디문제언어결과실행 시간메모리
477615Abrar_Al_SamitRegions (IOI09_regions)C++17
35 / 100
8101 ms43816 KiB
#pragma GCC optimize("Ofast") #include<bits/stdc++.h> using namespace std; const int MX = 200005; struct FenwickTree { vector<int> bit; // binary indexed tree int n = MX; int sum(int r) { if(bit.empty()) bit.resize(n); int ret = 0; for (; r >= 0; r = (r & (r + 1)) - 1) ret += bit[r]; return ret; } int sum(int l, int r) { return sum(r) - sum(l - 1); } void add(int idx, int delta) { if(bit.empty()) bit.resize(n); for (; idx < n; idx = idx | (idx + 1)) bit[idx] += delta; } }; const int B = 400; int N, R, Q; vector <int> g[MX], region[MX]; int H[MX], st[MX], en[MX], timer=1, stwho[MX]; map <int, vector <long long>> prep; void Flat(int v, int p) { stwho[timer] = v; st[v] = timer++; region[H[v]].push_back(st[v]); for(auto to : g[v]) if(to!=p) { Flat(to, v); } en[v] = timer-1; } int main() { cin >> N >> R >> Q; cin >> H[1]; for(int i=2; i<=N; ++i) { int p; cin >> p >> H[i]; g[p].push_back(i); } Flat(1, 1); vector <int> bigs; for(int i=1; i<=R; ++i) if(region[i].size()>B) { bigs.push_back(i); } FenwickTree A; for(int all=1; all<=R; ++all) { for(auto it : region[all]) { A.add(st[it], 1); } for(auto b : bigs) { if(prep[b].empty()) prep[b].resize(R+1); for(auto it : region[b]) { prep[b][all] += A.sum(st[it], en[it]); } } for(auto it : region[all]) { A.add(st[it], -1); } } // O(Q(rootNlogN + logR)) while(Q--) { int r1, r2; cin >> r1 >> r2; long long ans = 0; if(region[r1].size()>B) { ans = prep[r1][r2]; } else { for(auto p1 : region[r1]) { auto it = upper_bound(region[r2].begin(), region[r2].end(), en[stwho[p1]]); auto it2 = lower_bound(region[r2].begin(), region[r2].end(), p1); ans += it-it2; } } cout << ans << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...