Submission #298948

#TimeUsernameProblemLanguageResultExecution timeMemory
298948jovan_bRegions (IOI09_regions)C++17
0 / 100
3736 ms131076 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; int LIM = 500; int in[200005]; int out[200005]; int region[200005]; int parent[200005]; int cnt[200005]; vector <int> graf[200005]; ll gore[25005][505]; ll dole[25005][505]; int sada[25005]; int rev[25005]; int compress[25005]; int ccomp; int r; int tajm; vector <pair <int, int>> svi[25005]; vector <int> ins[25005]; void dfs(int v){ in[v] = ++tajm; sada[region[v]]++; if(compress[region[v]]){ for(int i=1; i<=r; i++){ dole[i][compress[region[v]]] += sada[region[v]]; } dole[region[v]][compress[region[v]]]--; gore[region[v]][compress[region[v]]]--; } for(int i=1; i<=ccomp; i++){ gore[region[v]][i] += sada[rev[i]]; } for(auto c : graf[v]){ dfs(c); } sada[region[v]]--; out[v] = tajm; svi[region[v]].push_back({in[v], 1}); svi[region[v]].push_back({out[v]+1, -1}); ins[region[v]].push_back(in[v]); } int main(){ ios_base::sync_with_stdio(false), cin.tie(0); int n, q; cin >> n >> r >> q; cin >> region[1]; cnt[region[1]]++; for(int i=2; i<=n; i++){ cin >> parent[i] >> region[i]; cnt[region[i]]++; graf[parent[i]].push_back(i); } for(int i=1; i<=r; i++){ if(cnt[i] <= LIM) continue; compress[i] = ++ccomp; rev[ccomp] = i; } dfs(1); return 0; for(int i=1; i<=r; i++) sort(svi[i].begin(), svi[i].end()); for(int i=1; i<=r; i++) sort(ins[i].begin(), ins[i].end()); while(q--){ int a, b; cin >> a >> b; if(cnt[a] > LIM){ cout << gore[b][compress[a]] << endl; continue; } if(cnt[b] > LIM){ cout << dole[a][compress[b]] << endl; continue; } int k = svi[a].size(); int j = -1; int tren = 0; ll res = 0; for(auto c : ins[b]){ while(j < k-1 && c >= svi[a][j+1].first){ j++; tren += svi[a][j].second; } res += tren; } cout << res << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...