Submission #1182600

#TimeUsernameProblemLanguageResultExecution timeMemory
1182600ttamxTree (IOI24_tree)C++17
100 / 100
89 ms37524 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N=2e5+5; const int W=1e6+5; int n,m; int p[N],pa[N],sz[N]; vector<int> adj[N]; vector<pair<int,int>> event; ll w[N],cnt[W],qs1[W],qs2[W]; bool vis[N],alive[N]; ll base; int fp(int u){return pa[u]=u==pa[u]?u:fp(pa[u]);} void uni(int u,int v){ u=fp(u),v=fp(v); if(u==v)return; pa[v]=u; sz[u]+=sz[v]; if(alive[v])alive[u]=true; } void init(vector<int> _p,vector<int> _w){ n=_p.size(); for(int i=0;i<n;i++){ p[i]=_p[i]; w[i]=_w[i]; if(i)adj[p[i]].emplace_back(i); } for(int i=0;i<n;i++){ pa[i]=i; sz[i]=1; if(adj[i].empty())base+=w[i]; else event.emplace_back(w[i],i); } sort(event.rbegin(),event.rend()); for(auto [t,u]:event){ vis[u]=true; if(alive[fp(u)])cnt[sz[fp(u)]]-=t; sz[fp(u)]--; for(auto v:adj[u]){ if(alive[fp(v)])cnt[sz[fp(v)]]-=t; uni(u,v); } cnt[sz[fp(u)]]+=t; alive[fp(u)]=true; } for(int i=1;i<W;i++){ qs1[i]=qs1[i-1]+cnt[i]; qs2[i]=qs2[i-1]+cnt[i]*i; } } ll query(int L,int R){ int k=R/L; return base*L+(qs2[W-1]-qs2[k])*L-(qs1[W-1]-qs1[k])*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...