Submission #679151

#TimeUsernameProblemLanguageResultExecution timeMemory
679151socpiteFireworks (APIO16_fireworks)C++17
100 / 100
236 ms59184 KiB
#include<bits/stdc++.h> using namespace std; #define f first #define s second typedef long long ll; const int maxn = 3e5+5; const int mod = 998244353; const ll inf = 1e18; int n, m; ll W[maxn]; int hh[maxn], sz[maxn]; priority_queue<ll> pq[maxn]; vector<int> graph[maxn]; pair<ll, ll> func[maxn]; void ph(int x){ func[x].s+=pq[x].top(); pq[x].pop(); func[x].f--; } void add(int x, ll val){ func[x].s -= val; pq[x].push(val); func[x].f++; } void Union(int x, int d){ func[x].f += func[d].f; func[x].s += func[d].s; while(!pq[d].empty()){ pq[x].push(pq[d].top()); pq[d].pop(); } } void dfs(int x){ sz[x]++; if(x > n){ func[x] = {1, -W[x]}; hh[x]=x; pq[x].push(W[x]); pq[x].push(W[x]); } else{ int bc = 0; for(auto v: graph[x]){ dfs(v); sz[x]+=sz[v]; if(sz[bc] < sz[v])bc = v; } int id = hh[bc]; hh[x] = id; for(auto v: graph[x]){ if(v == bc)continue; Union(id, hh[v]); } func[id].s+=W[x]; while(func[id].f > 1)ph(id); ll p1 = pq[id].top(); ph(id); ll p2 = pq[id].top(); ph(id); add(id, p1+W[x]); add(id, p2+W[x]); } //cout << x << " " << func[hh[x]].f << " " << func[hh[x]].s << "\n"; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for(int i = 2; i <= n+m; i++){ int x; cin >> x >> W[i]; graph[x].push_back(i); } dfs(1); ph(hh[1]); cout << func[hh[1]].s; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...