社区讨论

基环树模板题 90分 WA

P2607[ZJOI2008] 骑士参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lobcaszn
此快照首次捕获于
2023/10/29 18:40
2 年前
此快照最后确认于
2023/11/04 00:26
2 年前
查看原帖
第九个点 WA 了。
CPP
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#define ll long long
#define re register int
#define il inline
using namespace std;
il int read()
{
  int x=0,f=1;char ch=getchar();
  while(!isdigit(ch)&&ch!='-')ch=getchar();
  if(ch=='-')f=-1,ch=getchar();
  while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  return x*f;
}
il void print(ll x)
{
  if(x<0)putchar('-'),x=-x;
  if(x/10)print(x/10);
  putchar(x%10+'0');
}
il ll max(ll x,ll y){return x>=y?x:y;}
const int N=1e6+5,inf=0x3f3f3f3f;
int n,m,cnt,flag,vis[N],a[N],nxt[N<<1],head[N],tot=1,go[N<<1],st[N],top;
vector<int>r[N];ll f[N][2],g[N][2],ans;
bool b[N];
il void Add(int x,int y)
{
	nxt[++tot]=head[x];
	head[x]=tot;go[tot]=y;
}
il void Tarjan(int x,int p)
{
	if(flag)return;
	st[++top]=x;vis[x]=p;
	for(re i=head[x],y;i,y=go[i];i=nxt[i])
	{
		if(!vis[y])Tarjan(y,p);
		else {
			if(vis[y]!=p)continue;
			flag=1;
			while(st[top]!=y&&st[top]){
				r[p].push_back(st[top]);
				b[st[top]]=1;top--;
			}
			r[p].push_back(y);b[y]=1;
			return;
		}
		if(flag)return;
	}
	if(st[top]==x)top--;
}
il void dfs(int x,int fa)
{
	f[x][1]=a[x];
	for(re i=head[x],y;i,y=go[i];i=nxt[i])
	{
		if(y==fa||b[y])continue;dfs(y,x);
		f[x][1]+=(ll)f[y][0];
		f[x][0]+=(ll)max(f[y][0],f[y][1]);
	}
}
signed main()
{
	n=read();
	for(re i=1,x;i<=n;i++)a[i]=read(),x=read(),Add(x,i);
	for(re i=1;i<=n;i++)
	if(!vis[i]){
		top=flag=0;Tarjan(i,++cnt);
	}
	for(re i=1;i<=cnt;i++)
	{
		if(r[i].size()==0)continue;
		int ans1=0;g[0][0]=g[0][1]=0;
		for(re j=0;j<r[i].size();j++)dfs(r[i][j],0);
		for(re j=1;j<=r[i].size();j++)
		{
			g[j][0]=(ll)max(g[j-1][0],g[j-1][1])+f[r[i][j-1]][0];
			g[j][1]=(ll)max(f[r[i][j-1]][0],f[r[i][j-1]][1])+g[j-1][0];
		}
		ans1=g[r[i].size()][0];
		g[r[i].size()+1][0]=g[r[i].size()+1][1]=0;
		for(re j=r[i].size();j>=1;j--)
		{
			g[j][0]=(ll)max(g[j+1][0],g[j+1][1])+f[r[i][j-1]][0];
			g[j][1]=(ll)max(f[r[i][j-1]][0],f[r[i][j-1]][1])+g[j+1][0];
		}
		ans+=(ll)max(ans1,g[1][0]);
	}
	print(ans);
	return 0;
}
答案
CPP
96063967308
我的输出
CPP
96063478172

回复

1 条回复,欢迎继续交流。

正在加载回复...