제출 #1315381

#제출 시각아이디문제언어결과실행 시간메모리
1315381vneduFireworks (APIO16_fireworks)C++17
100 / 100
213 ms68472 KiB
#include<bits/stdc++.h> using namespace std; #define TASK "light" const int N = 3e5 + 5; int n,m; long long sum=0; vector<pair<int,int>> adj[N]; multiset<long long> f[N]; void dfs(int u, int pa, int l) { // cout<<u<<' '<<pa<<'\n'; if(u>n) { f[u].insert(l); f[u].insert(l); return; } for(pair<int,int> p : adj[u]) { int v=p.first,len=p.second; if(v!=pa) { dfs(v,u,len); if((int)f[u].size()<(int)f[v].size()) { f[v].insert(f[u].begin(),f[u].end()); f[u].clear(); swap(f[u],f[v]); } else { f[u].insert(f[v].begin(),f[v].end()); f[v].clear(); } } } // cout<<u<<' '<<(int)adj[u].size()-1<<'\n'; // for(long long pos : f[u]) cout<<pos<<' '; // cout<<'\n'; if(u!=1) { long long slope=(int)adj[u].size()-1-1; long long ammot=0,khong=0; while(1) { if(f[u].empty() || slope<=-2) break; long long r=*(--(f[u].end())),l; f[u].erase(--(f[u].end())); if(f[u].empty()) l=0; else l=*(--(f[u].end())); if(slope==-1) ammot=r-l; if(slope==0) khong=r-l; --slope; } long long curPos; if(f[u].empty()) curPos=0; else curPos=*(--(f[u].end())); curPos+=ammot+l; if(curPos) f[u].insert(curPos); curPos+=khong; if(curPos) f[u].insert(curPos); } else { int slope=(int)adj[u].size(); int firstSlope=slope-(int)f[u].size(); // cout<<sum<<' '<<firstSlope<<' '<<slope<<'\n'; if(firstSlope>0) cout<<sum; else { while(slope>1) { --slope; f[u].erase(--(f[u].end())); } long long opt=*(--(f[u].end())); sum+=firstSlope*opt; for(long long pos : f[u]) sum+=opt-pos; cout<<sum; } } } void solve() { cin>>n>>m; for(int i=2;i<=n+m;++i) { int p,l; cin>>p>>l; sum+=l; adj[i].push_back({p,l}); adj[p].push_back({i,l}); } dfs(1,0,0); } int main(void) { // freopen(TASK".inp","r",stdin); // freopen(TASK".out","w",stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int testcase=1; // cin>>testcase; while(testcase--) solve(); 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...