제출 #478216

#제출 시각아이디문제언어결과실행 시간메모리
478216Abrar_Al_SamitRegions (IOI09_regions)C++17
100 / 100
4994 ms34708 KiB
#pragma GCC optimize("Ofast") #include<bits/stdc++.h> using namespace std; const int MX = 200005; const int B = 447; int N, R, Q; vector <int> g[MX], region[MX]; int H[MX], st[MX], en[MX], stwho[MX]; int idx[MX], timer=1; long long prep[B][25001]; 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; } void DFS(int v, int p, int reg, int cnt) { if(H[v]==reg) ++cnt; else prep[idx[reg]][H[v]] += cnt; for(auto u : g[v]) if(u!=p) { DFS(u, v, reg, cnt); } } 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); int cur = 0; for(int i=1; i<=R; ++i) if(region[i].size()>B) { idx[i] = cur++; DFS(1, 1, i, 0); } // O(Q(rootNlogN + logR)) while(Q--) { int r1, r2; cin >> r1 >> r2; long long ans = 0; if(region[r1].size()>B) { ans = prep[idx[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; } } assert(ans>=0); cout << ans << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...