Submission #953161

#TimeUsernameProblemLanguageResultExecution timeMemory
953161UnforgettableplFireworks (APIO16_fireworks)C++17
55 / 100
2073 ms73408 KiB
#include <bits/stdc++.h> #include <utility> using namespace std; #define int long long struct line{ int m,n; multiset<int> points; line(){} line(int m,int n,multiset<int> points):m(m),n(n),points(points){} void operator+=(const line &other){ m+=other.m; n+=other.n; for(int i:other.points)points.insert(i); } }; int n,m; vector<pair<int,int>> adj[300001]; line functions[300001]; void dfs(int x,int p){ if(x>n) { functions[x] = {1, -adj[x][0].second, {adj[x][0].second, adj[x][0].second}}; return; } int len = 0; line curr(0,0,{}); for(auto&i:adj[x]){ if(i.first!=p){ dfs(i.first,x); if(functions[i.first].points.size()>curr.points.size())swap(curr,functions[i.first]); curr+=functions[i.first]; } else len = i.second; } int currsum = curr.n; int currslope = curr.m; for(auto i=--curr.points.end();i!=curr.points.begin();i--){ currslope--; if(currslope==-1)break; currsum+=*i; } while(curr.m>1){ curr.m--; curr.points.erase(--curr.points.end()); } int f = *--curr.points.end(); curr.points.erase(--curr.points.end()); int s = *--curr.points.end(); curr.points.erase(--curr.points.end()); curr.points.insert(s+len); curr.points.insert(f+len); curr.n = currsum-(f+len); functions[x] = curr; } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for(int i=2;i<=n+m;i++){ int p,c;cin>>p>>c; adj[i].emplace_back(p,c); adj[p].emplace_back(i,c); } dfs(1,0); line ans = functions[1]; int currsum = ans.n; int currslope = ans.m; for(auto i=--ans.points.end();i!=ans.points.begin();i--){ currslope--; if(currslope==-1)break; currsum+=*i; } cout << currsum << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...