记录编号 576753 评测结果 AAAAWTEEEE
题目名称 [ZJOI 2008] 骑士 最终得分 40
用户昵称 Gravatarguobinbin 是否通过 未通过
代码语言 C++ 运行时间 4.769 s
提交时间 2022-10-15 19:39:52 内存使用 44.84 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n;
int s[1000050];
int t[1000050];
vector<int> ed[1000050];
long long an=0;
int pr[1000050];
int ne[1000050];
int k;
bool dd[1000050]={};
long long dfs(int x){
	//cout<<x<<endl;
	if(pr[n+1]==0){
		return 0;
	}
	if(pr[n+1]==ne[0]){
		return s[x];
	}
	dd[x]=true;
	ne[pr[x]]=ne[x];
	pr[ne[x]]=pr[x];
	//cout<<pr[x]<<endl;
	long long re;
	//for(int i=ne[0];i!=n+1;i=ne[i]){
//		cout<<i<<" ";
//	}
//	cout<<endl;
//	for(int i=pr[n+1];i!=0;i=pr[i]){
//		cout<<i<<" ";
//	}
//	cout<<endl;
	re=dfs(pr[x]);
	bool d[1000050];
	for(int i=0;i<ed[x].size();i++){
		d[ed[x][i]]=dd[ed[x][i]];
		if(dd[ed[x][i]]==true){
			continue;
		}
		ne[pr[ed[x][i]]]=ne[ed[x][i]];
		pr[ne[ed[x][i]]]=pr[ed[x][i]];
		dd[ed[x][i]]=true;
	}
	re=max(re,s[x]+dfs(pr[x]));
	for(int i=ed[x].size()-1;i>=0;i--){
		dd[ed[x][i]]=d[ed[x][i]];
		if(dd[ed[x][i]]==true){
			continue;
		}
		ne[pr[ed[x][i]]]=ed[x][i];
		pr[ne[ed[x][i]]]=ed[x][i];
	}
	dd[x]=false;
	ne[pr[x]]=x;
	pr[ne[x]]=x;
	return re;
}
int main(){
	freopen("bzoj_1040.in","r",stdin);
	freopen("bzoj_1040.out","w",stdout);
	scanf("%d",&n);
	ne[0]=1;
	pr[n+1]=n;
	for(int i=1;i<=n;i++){
		pr[i]=i-1;
		ne[i]=i+1;
		scanf("%d%d",&s[i],&t[i]);
		ed[i].push_back(t[i]);
		ed[t[i]].push_back(i);
	}
	for(int i=1;i<=n;i++){
		if(dd[i]==true){
			continue;
		}
		k=0;
		for(int j=0;j<ed[i].size();j++){
			if(dd[ed[i][j]]==true){
				continue;
			}
			k+=s[ed[i][j]];
			if(k>s[i]){
				break;
			}
		}
		if(s[i]>=k){
			an+=s[i];
			ne[pr[i]]=ne[i];
			pr[ne[i]]=pr[i];
			dd[i]=true;
			for(int j=0;j<ed[i].size();j++){
				if(dd[ed[i][j]]==true){
					continue;
				}
				ne[pr[ed[i][j]]]=ne[ed[i][j]];
				pr[ne[ed[i][j]]]=pr[ed[i][j]];
				dd[ed[i][j]]=true;
			}
		}
	}
//	for(int i=ne[0];i!=n+1;i=ne[i]){
//		cout<<i<<" ";
//	}
//	cout<<endl;
//	for(int i=pr[n+1];i!=0;i=pr[i]){
//		cout<<i<<" ";
	//}
//	cout<<endl;
	an+=dfs(pr[n+1]);
	printf("%d",an);
	return 0;
}