제출 #1360212

#제출 시각아이디문제언어결과실행 시간메모리
1360212Faisal_SaqibFireworks (APIO16_fireworks)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int N=700,K=1e3;
int p[N],c[N];
vector<int> ma[N];
int dp[N][K];
// 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];
//     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;
// }
int n,m;
void dfs1(int x)
{
    for(auto y:ma[x])
    {
        dfs1(y);
        for(int j=0;j<K;j++)
        {
            dp[x][j]+=dp[y][j];
        }
    }
    if(ma[x].size()==0)
    {
        if(x<=n)
        {
            cout<<"Fudge"<<endl;
        }
    }
    if(x>n)
    {
        for(int j=1;j<K;j++) // we can only make it zero other values are inf
        {
            dp[x][j]=1e16;
        }
        if(ma[x].size()!=0)
        {
            cout<<"Fudge"<<endl;
            exit(-1);
        }
        // only 
    }


    for(int j=1;j<K;j++)
    {
        dp[x][j]=min(dp[x][j],dp[x][j-1]+1);
    }
    // for(int j=1;j<K;j++)
    for(int j=K-2;j>=0;j--)
    {
        dp[x][j]=min(dp[x][j],dp[x][j+1]+1);
    }

    for(int j=K-1;j>=0;j--)
    {
        if(j>=c[x])
        {
            dp[x][j]=dp[x][j-c[x]];
        }
        else
            dp[x][j]=1e16;
    }

}
void solve()
{
    cin>>n>>m;
    for(int i=2;i<=n+m;i++)
    {
        cin>>p[i]>>c[i];
        ma[p[i]].push_back(i);
        for(int j=0;j<K;j++)
        {
            dp[i][j]=0;
        }
    }
for(int j=0;j<K;j++)
        {
            dp[1][j]=0;
        }    // dfs(1);
    // cout<<ans[1]<<endl;
    dfs1(1);
    int ans=1e16;
    for(int j=0;j<K;j++)
    {
        ans=min(ans,dp[1][j]);
    }
    cout<<ans<<endl;
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--)solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…