Submission #1324098

#TimeUsernameProblemLanguageResultExecution timeMemory
1324098PieArmyJobs (BOI24_jobs)C++20
100 / 100
199 ms89336 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)

int n;
ll arr[300023];
int par[300023];
vector<int>child[300023];
ll need[300023],win[300023];
set<pair<ll,int>>st[300023];

void dfs(int pos){
	for(int x:child[pos]){
		dfs(x);
		if(win[x]>=0){
			st[pos].insert({need[x],x});
		}
	}
	need[pos]=-arr[pos];
	win[pos]=arr[pos];
	while(win[pos]<0&&st[pos].size()){
		need[pos]=max(need[pos],-(win[pos]-st[pos].begin()->fr));
		int x=st[pos].begin()->sc;
		win[pos]+=win[x];
		st[pos].erase(st[pos].begin());
		if(st[x].size()>st[pos].size()){
			swap(st[x],st[pos]);
		}
		for(auto y:st[x]){
			st[pos].insert(y);
		}
		st[x].clear();
	}
}

signed main(){
	ios_base::sync_with_stdio(23^23);cin.tie(0);
	cin>>n>>arr[0];
	for(int i=1;i<=n;i++){
		cin>>arr[i]>>par[i];
		child[par[i]].pb(i);
	}
	dfs(0);
	ll ans=win[0];
	while(st[0].size()){
		int x=st[0].begin()->sc;
		if(need[x]>ans)break;
		ans+=win[x];
		st[0].erase(st[0].begin());
		if(st[x].size()>st[0].size()){
			swap(st[x],st[0]);
		}
		for(auto y:st[x]){
			st[0].insert(y);
		}
		st[x].clear();
	}
	cout<<ans-arr[0]<<endl;
}
#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...