70分wa求助
查看原帖
70分wa求助
13805
Ackoter楼主2021/11/26 21:55
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<list>
#include<map>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
long long n;
long long f[2000010],v[2000010];
long long head[2000010],cnt=1;
struct edg{
	long long next,to;
}edge[4000005];
void add_edge(long long u,long long v)
{
	edge[++cnt].next=head[u];
	edge[cnt].to=v;
	head[u]=cnt;
}
long long dp[3][2000010][2],vis[2][2000010],j,del[2000010],m;
void DFS(long long now,long long type)
{
	vis[type][now]=1;
	for(long long i=head[now];;i=edge[i].next)
	{
		if(!i) break;
		if(i==del[j]||i==(del[j]^1)) continue;
		if(vis[type][edge[i].to]) continue;
		DFS(edge[i].to,type);
		dp[type][now][0]+=max(dp[type][edge[i].to][0],dp[type][edge[i].to][1]);
		dp[type][now][1]+=dp[type][edge[i].to][0];
	}
	dp[type][now][1]+=v[now];
}
long long lj,jc=0;
long long juruo[2000010];
long long finds(long long x)
{
	if(juruo[x]==x) return x;
	return juruo[x]=finds(juruo[x]);
}
inline void hb(long long x,long long y)
{
	juruo[finds(x)]=finds(y);
}
bool cmp(long long a,long long b)
{
	return edge[a].to<edge[b].to;
}
signed main()
{
//	freopen("az.txt","r",stdin);
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++) juruo[i]=i;
	for(long long i=1;i<=n;i++) 
	{
		scanf("%lld%lld",&v[i],&f[i]);
		add_edge(i,f[i]);
		add_edge(f[i],i);
		if(finds(i)!=finds(f[i])) hb(i,f[i]); else del[++m]=cnt;
	}
    for(long long i=1;i<=n;i++)
		if(!vis[1][i])
		{
			++j;
			swap(jc,v[edge[del[j]^1].to]);
			DFS(i,0);
			swap(jc,v[edge[del[j]^1].to]);
			swap(jc,v[edge[del[j]].to]);
			DFS(i,1);
			swap(jc,v[edge[del[j]].to]);
			lj+=max(max(dp[0][i][0],dp[0][i][1]),max(dp[1][i][0],dp[1][i][1]));
		}
	printf("%lld",lj);
	return 0;
}

前6个点+第9个(没法下数据真的不好调)是思路错了还是有什么细节舅舅孩子

2021/11/26 21:55
加载中...