Submission #365101

#TimeUsernameProblemLanguageResultExecution timeMemory
365101crackersamdjamRegions (IOI09_regions)C++17
95 / 100
8010 ms110748 KiB
#include <bits/stdc++.h> #define all(x) (x).begin(), (x).end() #ifndef ONLINE_JUDGE template<typename T> void pr(T a){std::cerr<<a<<std::endl;} template<typename T,typename... Args> void pr(T a, Args... args) {std::cerr<<a<<' ',pr(args...);} #else template<typename... Args> void pr(Args... args){} #endif using namespace std; using ll = long long; const int MM = 2e5+5, SQ = 500; int n, m, q; int val[MM]; vector<int> adj[MM]; int in[MM], out[MM], t; map<int, ll> cnt[MM], parcnt; vector<int> nodes[MM]; int bit[MM]; map<pair<int, int>, ll> ans; vector<int> big, smol; void update(int i, int v){ for(; i < MM; i += i&-i) bit[i] += v; } int query(int i){ int v = 0; for(; i; i -= i&-i) v += bit[i]; return v; } void dfs(int cur, int pre){ in[cur] = ++t; if(size(nodes[val[cur]]) <= SQ){ for(int i: big) ans[{i, val[cur]}] += parcnt[i]; } parcnt[val[cur]]++; int id = 0; for(auto u: adj[cur]){ if(u == pre) continue; dfs(u, cur); if(size(cnt[u]) > size(cnt[id])) id = u; } cnt[cur] = move(cnt[id]); for(auto u: adj[cur]){ if(u == pre) continue; if(u != id){ for(auto [a, c]: cnt[u]){ cnt[cur][a] += c; } cnt[u].clear(); // cnt[u].shrink_to_fit(); } } cnt[cur][val[cur]]++; if(size(nodes[val[cur]]) <= SQ){ for(int i: big) ans[{val[cur], i}] += cnt[cur][i]; } else{ //big to big for(int i: big){ ans[{val[cur], i}] += cnt[cur][i]; } } parcnt[val[cur]]--; out[cur] = t; } int main(){ cin>>n>>m>>q; cin>>val[1]; nodes[val[1]].emplace_back(1); for(int i = 2,p; i <= n; i++){ cin>>p>>val[i]; adj[p].emplace_back(i); nodes[val[i]].emplace_back(i); } for(int i = 1; i <= m; i++){ if(size(nodes[i]) > SQ){ big.emplace_back(i); } else{ smol.emplace_back(i); } } dfs(1, 0); for(int i = 0,a,b; i < q; i++){ cin>>a>>b; // assert(a != b); if(size(nodes[a]) > SQ or size(nodes[b]) > SQ){ cout<<ans[{a, b}]<<'\n'; } else{ for(int j: nodes[b]) update(in[j], 1); ll ret = 0; for(int j: nodes[a]) ret += query(out[j]) - query(in[j]-1); for(int j: nodes[b]) update(in[j], -1); cout<<ret<<'\n'; } } } /* I need online solution... I precompute all small-large and all large-large smol-smol ac big-big ac big-smol wa */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...