性感代码,在线求调
查看原帖
性感代码,在线求调
593791
_Catluo_楼主2023/3/9 20:03

看题解改了很久,还是错的

50分,WA:#1,#2,#5,#9,#10

#include<bits/stdc++.h>
using namespace std;
int n,s,t,size;
long long int ans;
int p[1000005];
long long int f[1000005][2],g[1000005][2];
int head[1000005],nxt[2000005],to[2000005],tot,E;
bool vis[1000005];
bool vis1[1000005];
bool vis2[1000005];
bool used[100005];
void add(int u,int v){
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
void fg(int x){
	used[x]=1;
	for(int i=head[x];i;i=nxt[i])
		if(!used[to[i]])fg(to[i]);
}
void fin(int x,int fa){
	if(E)return;
	vis[x]=1;
	for(int i=head[x];i;i=nxt[i]){
		if(!vis[to[i]])fin(to[i],x);
		else if(to[i]!=fa){
			s=x;
			t=to[i];
			E=i;
			return;
		}
	}
}
void dp1(int x){
	vis1[x]=1;
	f[x][1]=p[x];
	f[x][0]=0;
	for(int i=head[x];i;i=nxt[i]){
		if(!vis1[to[i]]&&(i^1)!=E){
			dp1(to[i]);
			f[x][0]+=max(f[to[i]][0],f[to[i]][1]);
			f[x][1]+=f[to[i]][0];	
		}
	}
}
void dp2(int x){
	vis2[x]=1;
	g[x][1]=p[x];
	g[x][0]=0;
	for(int i=head[x];i;i=nxt[i]){
		if(!vis2[to[i]]&&(i^1)!=E){
			dp2(to[i]);
			g[x][0]+=max(g[to[i]][0],g[to[i]][1]);
			g[x][1]+=g[to[i]][0];	
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int v;
		cin>>p[i]>>v;
		add(i,v);
		add(v,i);
	}
	for(int i=1;i<=n;i++){
		if(used[i])continue;
		fg(i);E=0;
		fin(i,0);
		dp1(s);
		dp2(t);
		ans+=max(f[s][0],g[t][0]);
	}
	printf("%lld",ans);
	return 0;
}
2023/3/9 20:03
加载中...