제출 #1194265

#제출 시각아이디문제언어결과실행 시간메모리
1194265UnforgettableplJobs (BOI24_jobs)C++20
11 / 100
220 ms55368 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N,s;
    cin >> N >> s;
    int back = s;
    vector<vector<int>> adj(N+1);
    vector<int> cost(N+1);
    for(int i=1;i<=N;i++){
        int p;
        cin >> cost[i] >> p;
        adj[p].emplace_back(i);
    }
    auto add = [&](pair<int,map<int,int>> &a,pair<int,map<int,int>> &b){
        if(a.second.size()<b.second.size())swap(a,b);
        for(auto&[x,y]:b.second){
            a.second[x-b.first+a.first]+=y;
        }
    };
    function<pair<int,map<int,int>>(int)> dfs = [&](int x){
        pair<int,map<int,int>> curr = {0,{}};
        if(cost[x]>=0){curr.second[0]=cost[x];}
        for(int&i:adj[x]){
            auto t = dfs(i);
            add(curr,t);
        }
        if(cost[x]<0){
            curr.first+=cost[x];
            cost[x] = -cost[x];
            while(!curr.second.empty()){
                int trans = min(cost[x],curr.second.begin()->second);
                curr.second.begin()->second-=trans;
                cost[x]-=trans;
                if(curr.second.begin()->second==0)curr.second.erase(curr.second.begin());
                if(cost[x]==0)break;
            }
        }
        return curr;
    };
    auto t = dfs(0);
    while(!t.second.empty() and t.second.begin()->first<=s+t.first){
        s+=t.second.begin()->second;
        t.second.erase(t.second.begin());
    }
    cout << s-back << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...