제출 #1360182

#제출 시각아이디문제언어결과실행 시간메모리
1360182Faisal_SaqibFireworks (APIO16_fireworks)C++20
7 / 100
30 ms63132 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6;
int p[N],c[N];
vector<int> ma[N];
ll ans[N],offset[N];
priority_queue<int> lt[N];
priority_queue<int,vector<int>,greater<int>> rt[N];

void merge(int x,int y)
{
    ans[x]+=ans[y];
    while(lt[y].size())
    {
        int v=lt[y].top()+offset[y];
        int rtp=rt[x].top()+offset[x];
        lt[y].pop();

        if(v<=rtp)
        {
            lt[x].push(v-offset[x]);
        }
        else
        {
            ans[x]+=(v-rtp);
            lt[x].push(rtp);
            rt[x].pop();
            rt[x].push(v-offset[x]);
        }
    }
    while(rt[y].size())
    {
        int v=rt[y].top()+offset[y];
        int ltp=lt[x].top()+offset[x];
        
        rt[y].pop();

        if(ltp<=v)
        {
            rt[x].push(v-offset[x]);
        }
        else
        {   
            ans[x]+=(ltp-v);
            rt[x].push(ltp);
            lt[x].pop();
            lt[x].push(v-offset[x]);
        }
    }
}
void dfs(int x)
{
    if(ma[x].size()==0)
    {
        lt[x].push(c[x]);
        rt[x].push(c[x]);
        ans[x]=0;
        offset[x]=0;
        return;
    }
    bool f=1;
    lt[x].push(-1e9);
    rt[x].push(1e9);
    ans[x]=0;
    offset[x]=0;
    for(auto y:ma[x])
    {
        dfs(y);
        merge(x,y);
    }
    offset[x]+=c[x];
    // lt[x].push(1e9);
    int stv=lt[x].top();
    while(lt[x].size()>0)lt[x].pop();
    lt[x].push(stv);

    stv=rt[x].top();
    while(rt[x].size()>0)rt[x].pop();
    rt[x].push(stv);
    

    // cout<<"At "<<x<<' '<<ans[x]<<' '<<offset[x]<<endl;;
    // cout<<"LT: ";
    // vector<int> out;
    // for(auto y:lt[x])
    // while(lt[x].size())
    // {
    //     out.push_back(lt[x].top());
    //     lt[x].pop();
    // }
    // for(auto y:out)
    //     cout<<y<<' ',lt[x].push(y);
    // cout<<endl;
    // out.clear();
    // while(rt[x].size())
    // {
    //     out.push_back(rt[x].top());
    //     rt[x].pop();
    // }
    // cout<<"Rt ";
    // for(auto y:out)
    //     cout<<y<<' ',rt[x].push(y);
    // cout<<endl;
}
void solve()
{
    int n,m;
    cin>>n>>m;
    for(int i=2;i<=n+m;i++)
    {
        cin>>p[i]>>c[i];
        ma[p[i]].push_back(i);
    }
    dfs(1);
    cout<<ans[1]<<endl;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--)solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…