Submission #1362268

#TimeUsernameProblemLanguageResultExecution timeMemory
1362268boclobanchatJobs (BOI24_jobs)C++20
69 / 100
331 ms90640 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
const long long INF=4e18;
struct node
{
	long long d,sum,pos;
};
struct comp
{
	bool operator()(node a,node b)
	{
		if(a.d==b.d) return a.sum<b.sum;
		return a.d>b.d;
	}
};
int dsu[MAXN],cnt[MAXN],dsu2[MAXN],cnt2[MAXN];
long long A[MAXN],dis[MAXN],dp[MAXN],ans;
vector<int> ds[MAXN],vi[MAXN];
bool ck[MAXN];
priority_queue< node,vector<node>,comp > pq[MAXN];
int root(int i)
{
	if(!dsu[i]) return i;
	return dsu[i]=root(dsu[i]);
}
void merge(int i,int j)
{
	if((i=root(i))==(j=root(j))) return ;
	if(cnt[i]<cnt[j]) swap(i,j);
	while(!pq[j].empty()) pq[i].push(pq[j].top()),pq[j].pop();
	dsu[j]=i,cnt[i]+=cnt[j];
}
int root2(int i)
{
	if(!dsu2[i]) return i;
	return dsu2[i]=root2(dsu2[i]);
}
void merge2(int i,int j)
{
	if((i=root2(i))==(j=root2(j))) return ;
	if(cnt2[i]<cnt2[j]) swap(i,j);
	for(auto v:vi[j]) vi[i].push_back(v);
	dsu2[j]=i,cnt2[i]+=cnt2[j],vi[j].clear();
}
void dfs(int i,long long d)
{
	cnt[i]=0,cnt2[i]=1,vi[i].push_back(i);
	for(auto v:ds[i])
	{
		dfs(v,d+A[v]);
		merge(i,v);
	}
	int res=root(i);
	long long s=A[i],mx=max(0LL,-A[i]);
	while(!pq[res].empty()&&s<=0)
	{
		merge2(i,pq[res].top().pos);
		mx=max(mx,pq[res].top().d-s),s+=pq[res].top().sum,pq[res].pop(),cnt[res]--;
	}
	if(s>0) dp[i]=mx,cnt[res]++,pq[res].push({mx,s,i});
	else dp[i]=INF;
}
int main()
{
//	freopen("input.txt","r",stdin);
//	freopen("output.txt","w",stdout);
//    ios::sync_with_stdio(0);
//    cin.tie(0);
//    cout.tie(0);
    long long n,s;
    cin>>n>>s;
    for(int i=1;i<=n;i++)
    {
    	int res;
    	cin>>A[i]>>res;
    	ds[res].push_back(i);
	}
	dfs(0,0);
	priority_queue< pair<long long,int>,vector< pair<long long,int> >,greater< pair<long long,int> > > pq;
	pq.push({dp[0],0}),ans=s;
	while(!pq.empty())
	{
		long long a=pq.top().first;
		int pos=pq.top().second;
		pq.pop();
		if(ck[pos]) continue;
		if(a>ans) break;
		for(auto v:vi[root2(pos)])
		{
			ck[v]=true,ans+=A[v];
			for(auto u:ds[v]) pq.push({dp[u],u});
		}
	}
	cout<<ans-s;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...