这份代码厌氧,第一个样例吸不吸氧输出都不一样

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=1e6+17;
int n;
int v[N];
int f[N],rd[N];
bool tag[N],isc[N];
struct node{
	int nxt,to;
}q[N],p[N];int head[N],cnt;
void add(int x,int y){
	q[++cnt]=node{head[x],y};
	head[x]=cnt;return;
}
int find(int x){
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}
vector<int> pos[N/2];
int tp;
void findCir(int id,int x){
	isc[x]=1;
	if(x!=pos[id][0]){
		pos[id].push_back(x);
	}
	for(int i=head[x];i;i=q[i].nxt){
		int dd=q[i].to;
		if(dd==pos[id][0]) return;
		findCir(id,dd);
	} 
}long long dp[N][2];
void dfs(int x,int fa){
	dp[x][0]=0;dp[x][1]=v[x];
	for(int i=head[x];i;i=q[i].nxt){
		int dd=q[i].to;
		if(dd==fa||isc[dd]) continue;
		dfs(dd,x);
		dp[x][0]+=max(dp[dd][0],dp[dd][1]);
		dp[x][1]+=(dp[dd][0]);
	}
}
long long f1[N][2];
long long dp1(int id){
	f1[0][1]=dp[pos[id][0]][1];
	f1[0][0]=dp[pos[id][0]][0];
	int m=pos[id].size();
	for(int i=1;i<m;i++){
		f1[i][0]=max(f1[i-1][0],f1[i-1][1])+dp[pos[id][i]][0];
		f1[i][1]=f1[i-1][0]+dp[pos[id][i]][1];
		if(i==m-1||i==1){
			f1[i][1]=0;
		}
	}return max(f1[m-1][1],f1[m-1][0]);
}
long long dp2(int id){
	f1[0][1]=dp[pos[id][0]][0];
	f1[0][0]=dp[pos[id][0]][0];
	int m=pos[id].size();
	for(int i=1;i<m;i++){
		f1[i][0]=max(f1[i-1][0],f1[i-1][1])+dp[pos[id][i]][0];
		f1[i][1]=f1[i-1][0]+dp[pos[id][i]][1];
	}return max(f1[m-1][1],f1[m-1][0]);
}
signed main(){
	
	cin >> n;
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=n;i++){
		cin >> v[i];
		int tmp;cin >> tmp;
		add(i,tmp);rd[tmp]++;
		p[i]=node{tmp,i};
		int fx=find(i),fy=find(tmp);
		if(fx!=fy){
			f[fx]=fy;
		}else if(fx==fy&&!tag[fx]){
			isc[i]=1;tag[fx]=1;
			pos[++tp].push_back(i);	
		}
	}
	for(int i=1;i<=tp;++i){
		findCir(i,pos[i][0]);
	}for(int i=1;i<=n;++i) add(p[i].nxt,p[i].to);
	for(int i=1;i<=n;++i){
		if(isc[i]){
			dfs(i,0);
		}
	}
	long long ans=0,res;
	for(int i=1;i<=tp;++i){
		res=max(dp1(i),dp2(i));
		ans+=res;
	}cout << ans << '\n';
	return 0;
} 

1 条评论

  • 1

信息

ID
342
时间
1000ms
内存
256MiB
难度
8
标签
(无)
递交数
98
已通过
16
上传者