Submission #689600

#TimeUsernameProblemLanguageResultExecution timeMemory
689600baneRegions (IOI09_regions)C++17
0 / 100
167 ms131072 KiB
#include <bits/stdc++.h> #define pb push_back #define ll long long #define mp make_pair #define pb push_back using namespace std; const int nax = 501; const int NAX = 500*500 + 1; int N,R,Q; vector<int>S; vector<int>H; vector<int>adj[NAX]; vector<int>rs[25001]; int lend[NAX]; int ans[nax][25001]; int tour[NAX]; int mapa[NAX]; int main() { ios::sync_with_stdio(0);cin.tie(0); cin >> N >> R >> Q; S.resize(N + 1); H.resize(N + 1); cin >> H[1]; for (int i = 2; i<=N; i++){ cin >> S[i] >> H[i]; adj[S[i]].pb(i); } int timer = 0; function<void(int)>Dfs = [&](int u){ lend[u]=timer++; mapa[timer-1] = u; for (int& x : adj[u])Dfs(x); rs[H[u]].pb(lend[u]); tour[u]=timer-1; }; Dfs(1); memset(ans, 0, sizeof(ans)); function<int(int, int, int)>Dfs2 = [&](int u, int r2, int brojac){ int cnt = 0; for (int& x : adj[u]){ cnt+=Dfs2(x, r2, brojac); } if (H[u] == r2)++cnt; ans[H[u]][r2]+=cnt; return cnt; }; for(int i = 1; i<=R; i++){ sort(rs[i].begin(), rs[i].end()); if (rs[i].size() <= 500)continue; Dfs2(1,i,0); } while(Q--){ int a,b; cin >> a >> b; if (rs[a].size() > 500)cout<<ans[a][b]<<'\n'; else{ int tot = 0; for(int i = 0; i < (int)rs[a].size(); i++){ int l = rs[a][i]; int r = tour[mapa[l]]; int it1 = lower_bound(rs[b].begin(), rs[b].end(), l) - rs[b].begin(); int it2 = lower_bound(rs[b].begin(), rs[b].end(), r+1) - rs[b].begin(); tot+=(it2 - it1); } cout<<tot<<'\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...