Submission #1243557

#TimeUsernameProblemLanguageResultExecution timeMemory
1243557alexander707070Tree (IOI24_tree)C++20
18 / 100
65 ms20152 KiB
#include<bits/stdc++.h> #define MAXN 200007 using namespace std; int n; bool vis[MAXN]; long long leaves[MAXN]; vector<int> v[MAXN]; long long cost[MAXN],ans; long long L,R,sum[MAXN],dp[MAXN],L0,L1; long long pref[MAXN],suff[MAXN]; vector< pair<long long,long long> > comps; void dfs(int x){ vis[x]=true; if(cost[x]==0){ L0++; return; } if(v[x].empty()){ L1++; return; } for(int i:v[x]){ dfs(i); } } void init(vector<int> P, vector<int> W){ n=int(P.size()); for(int i=1;i<=n;i++)cost[i]=W[i-1]; for(int i=1;i<P.size();i++){ v[P[i]+1].push_back(i+1); } for(int i=1;i<=n;i++){ if(!vis[i]){ L0=L1=0; dfs(i); comps.push_back({L0+L1,L1}); } } sort(comps.begin(),comps.end()); for(int i=0;i<comps.size();i++){ pref[i]=comps[i].second; if(i>0)pref[i]+=pref[i-1]; } for(int i=comps.size()-1;i>=0;i--){ suff[i]=comps[i].first+comps[i].second; suff[i]+=suff[i+1]; } } long long query(int lt, int rt){ L=lt; R=rt; int l=-1,r=comps.size(),tt; while(l+1<r){ tt=(l+r)/2; if(comps[tt].first*L<=R){ l=tt; }else{ r=tt; } } long long s1=0,s2=0; if(r>0)s1=pref[r-1]*L; if(r<comps.size())s2=suff[r]*L - abs(r-int(comps.size()))*R; return s1+s2; } /*int main(){ init({-1, 0, 0}, {1, 1, 1}); cout<<query(1,1)<<"\n"; cout<<query(1,2)<<"\n"; return 0; }*/
#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...