Submission #1223033

#TimeUsernameProblemLanguageResultExecution timeMemory
1223033Szymon_PilipczukFireworks (APIO16_fireworks)C++20
7 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(),a.end()
#define rep(a,b) for(int a = 0;a<b;a++)
const int inf = 1e9;
const ll infl = 1e18;
vector<vector<int>> gr;
vector<int> l;
vector<ll> mod;
vector<priority_queue<ll>> pq;
vector<ll> ans;
int comb(vector<int> v,int cmod)
{
    int n = v.size();
    vector<int> c;
    pair<int,int> mx = {0,-1};
    ll mx2 = -1;
    for(int i : v)
    {
        if(pq[i].size() > mx.st)
        {
            mx = {pq[i].size(),i};
        }
        mx2 = max(mx2,pq[i].top()+mod[i]);
    }
    int r = mx.nd;
    ll sum = 0;
    for(int i : v)
    {
        if(r != i)
        {
            c.pb(i);
        }
        sum += ans[i] + mx2-(pq[i].top()+mod[i]);
    }
    for(int i : c)
    {
        while(!pq[i].empty())
        {
            pq[r].push((pq[i].top()+mod[i]-mod[r]));
            pq[i].pop();
        }
    }
    rep(i,n-1)
    {
        ll a = pq[r].top();
        pq[r].pop();
        sum -= (a-pq[r].top()) * (n-1-i);
    }
    ans[r] = sum;
    mod[r] -= cmod;
    ll b = pq[r].top();
    pq[r].pop();
    ll a = pq[r].top();
    pq[r].pop();
    pq[r].push(a+cmod);
    pq[r].push(b+cmod);
    return r;
}
int n,m;
int dfs(int v)
{
    if(gr[v].size() > 0)
    {
        vector<int> cu;
        for(int i : gr[v])
        {
            cu.pb(dfs(i));
        }
        return comb(cu,l[v]);
    }
    else
    {
        int c = v-n;
        pq[c].push(l[v]);
        pq[c].push(l[v]);
        mod[c] = 0;
        ans[c] = 0;
        return c;
    }
}
int main()
{
    cin>>n>>m;
    gr.resize(n+m);
    l.resize(n+m);
    l[0] = 0;
    for(int i = 1;i<n+m;i++)
    {
        int p,c;
        cin>>p>>c;
        p--;
        gr[p].pb(i);
        l[i] = c;
    }
    ans.resize(m);
    mod.resize(m);
    pq.resize(m);
    cout<<ans[dfs(0)]<<"\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...