60ptS求助,wa0n#7‘’#8,9
查看原帖
60ptS求助,wa0n#7‘’#8,9
740329
sunaohua楼主2023/3/9 15:34
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000006];
long long val[1000006];
int y[1000006];
int cnt=0;
int root[1000006];
int croot[1000006];
int z[1000006];
vector<int> zz[1000006];
long long dp[10000006][2][3];
int q[1000006];
inline char nc(){
    static char buf[1000010],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000010,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    register int s=0,w=0;
    static char ch=nc();
    for(;!isdigit(ch);)ch=nc();
    for(;isdigit(ch);){
        s=(s<<1)+(s<<3)+(ch^48);
        ch=nc();
    }
    return w?-s:s;
}
inline long long max0(long long a,long long b){
	return a>b? a:b;
}
int p[1000006];
void find(int x){
	int w=x;
	y[x]=1;
	int to=a[x];
	q[1]=x;
	p[x]=1;
	int tot=1;
	while(!y[to]){
//	cout<<0<<" "<<to<<endl;
	tot++;
	q[tot]=to;
	p[to]=1;
	y[to]=1;
	x=to;
	to=a[to];
//	cout<<w<<" "<<x<<" "<<to<<endl;
	}
	if(p[to]){
//	cout<<1<<" "<<to<<endl;
	cnt++;
	root[cnt]=to;
	croot[cnt]=x;
//	cout<<cnt<<" "<<root[cnt]<<" "<<croot[cnt]<<"*"<<endl;
	}
	for(int i=1;i<=tot;i++)
	p[q[i]]=0,q[i]=0;
	
}
int flag=0;
void dps(int b,int fa,int th,int op,int rt){
/*	if(a==th&&(op==0||op==2))
	val[a]=-1e14;*/
	dp[b][1][op]=val[b];
	for(int i=0;i<z[b];i++){
	int to=zz[b][i];
	if(to==fa||to==rt)
	continue;
	if(to==th){
	if(flag==0){
	flag=1;
	}
	else
	continue;	
	}
	dps(to,b,th,op,rt);
	dp[b][1][op]+=dp[to][0][op];
	dp[b][0][op]+=max0(dp[to][0][op],dp[to][1][op]);
//	if(a==3)
//	cout<<max0(dp[to][0][op],dp[to][1][op])<<endl;
	}
	if(b==th){
	if(op==1)
	dp[b][0][op]=-1e18;
	if(op==2||op==0)
	dp[b][1][op]=-1e18;
	}
//	cout<<b<<" "<<op<<" "<<dp[b][0][op]<<" "<<dp[b][1][op]<<endl;
}
signed main(){
	long long ans=0;
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
	val[i]=read();a[i]=read();
//cin>>val[i]>>a[i];
	z[i]++;
	z[a[i]]++;
	zz[i].push_back(a[i]);
	zz[a[i]].push_back(i);
	}
	for(int i=1;i<=n;i++){
	flag=0;
	if(!y[i])
	find(i);
	}
	for(int i=1;i<=cnt;i++){
	//cout<<"*"<<root[i]<<"*"<<croot[i]<<" "<<endl;
	if((a[root[i]]==croot[i])&&(a[croot[i]]==root[i])&&z[root[i]]==2&&z[croot[i]]==2){
	ans+=max0(val[root[i]],val[croot[i]]);	
	continue;
	}
	flag=0;
	dps(root[i],0,croot[i],0,root[i]);
	flag=0;
	dps(root[i],0,croot[i],1,root[i]);
	flag=0;
	dps(root[i],0,croot[i],2,root[i]);
	ans+=max0(max0(dp[root[i]][0][0],dp[root[i]][0][1]),dp[root[i]][1][2]);
	}
	cout<<ans;
	return 0;
}


2023/3/9 15:34
加载中...