Submission #1142090

#TimeUsernameProblemLanguageResultExecution timeMemory
1142090byunjaewooTree (IOI24_tree)C++20
100 / 100
129 ms40328 KiB
#include "tree.h" #include <bits/stdc++.h> using namespace std; using ll=long long; const int N=200010, M=1000010; int n, p[N], g[N], a[N]; bool w[N]; vector<pair<int, int>> v; ll x[N], y[N], l[N]; ll tot, c[M], s[M]; vector<int> adj[N]; int Find(int x) {return g[x]?(g[x]=Find(g[x])):x;} void Union(int u, int v, ll t) { u=Find(u), v=Find(v); if(l[u]) tot+=x[u]*(l[u]-t), c[y[u]]+=(l[u]-t), s[y[u]]+=y[u]*(l[u]-t); if(l[v]) tot+=x[v]*(l[v]-t), c[y[v]]+=(l[v]-t), s[y[v]]+=y[v]*(l[v]-t); x[v]+=x[u], y[v]+=y[u], l[v]=t, g[u]=v; } void init(vector<int> P, vector<int> W) { n=P.size(); for(int i=1; i<=n; i++) a[i]=W[i-1], v.push_back({a[i], i}); for(int i=2; i<=n; i++) p[i]=P[i-1]+1, adj[p[i]].push_back(i); for(int i=1; i<=n; i++) if(adj[i].empty()) x[i]++, y[i]++; sort(v.rbegin(), v.rend()); for(auto [t, k]:v) if(t) { w[k]=1; if(w[p[k]]) Union(k, p[k], t), y[Find(k)]--; for(int j:adj[k]) if(w[j]) Union(k, j, t); for(int j:adj[k]) if(!w[j]) y[Find(k)]++; l[Find(k)]=t; } for(int i=1; i<=n; i++) if(w[i] && Find(i)==i) { tot+=x[i]*l[i], c[y[i]]+=l[i], s[y[i]]+=y[i]*l[i]; } for(int i=M-2; i>=1; i--) c[i]+=c[i+1], s[i]+=s[i+1]; } ll query(int L_, int R_) { ll L=L_, R=R_; return tot*L+s[(R+L-1)/L]*L-c[(R+L-1)/L]*R; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...