P7925 五彩斑斓30分求调 悬赏5元
  • 板块学术版
  • 楼主Katz
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/3/25 18:41
  • 上次更新2023/10/23 20:31:22
查看原帖
P7925 五彩斑斓30分求调 悬赏5元
570194
Katz楼主2023/3/25 18:41
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
	int to,next;
}f[12010];
int head[6010],tot,n,siz[6010],fa[6010],val[6010],u,cnt,s;
struct dpdpdp
{
	int id,val,siz;
}dp[6010];
bool flag=true;
vector<dpdpdp>son[6010];
bool cmp(dpdpdp x,dpdpdp y)
{
	return x.val>y.val;
}
void add(int u,int v)
{
	f[++tot].to=v;
	f[tot].next=head[u];
	head[u]=tot;
}
void dfs1(int x)
{
	siz[x]=val[x];
	for(int i=head[x];i;i=f[i].next)
	{
		if(f[i].to==fa[x]) continue;
		fa[f[i].to]=x;
		dfs1(f[i].to);
		siz[x]+=siz[f[i].to];
		dp[++cnt].id=f[i].to;
		dp[cnt].val=val[f[i].to];
		dp[cnt].siz=siz[f[i].to];
		son[x].push_back(dp[cnt]);
	}
}
int top;
void dfs2(int x,int &b)
{
	if(son[x].size()<1) return ;
	top=b;
	sort(son[x].begin(),son[x].end(),cmp);
	for(int i=0;i<son[x].size();i++)
	{
		if(val[son[x][i].id]<0&&-val[son[x][i].id]<=b)
		{
			b+=val[son[x][i].id];
			dfs2(son[x][i].id,b);
		}
		else
		{
			if(val[son[x][i].id]>=0)
			{
				b+=val[son[x][i].id];
				dfs2(son[x][i].id,b);
			}
		}
		if(b<top) b=top;
		else top=b;
	}
}
signed main()
{
	cin>>n>>s;
	for(int i=1;i<n;i++)
	{
		cin>>u;
		add(u,i);
		add(i,u);
		if(u!=i) flag=false;
	}
	for(int i=1;i<=n;i++) cin>>val[i];
	int ans,sum;
	if(flag==true)
	{
		ans=sum=s;
		for(int i=1;i<=n;i++)
		{
			sum+=val[i];
			if(sum<0) break;
			ans=max(sum,ans);
		}
		return cout<<ans<<endl,0;
	}
	dfs1(1);
	if(s>-val[1]&&val[1]<0) s+=val[1];
	else
	{
		if(val[1]>0) s+=val[1];
		else return cout<<s<<endl,0;
	}
	dfs2(1,s);
	return cout<<s<<endl,0;
}

教练给我看了题解区第3篇题解

然后我打完对着改了很久,依然五彩斑斓,有AC,MLE,TLE,RE等数不胜数的结果/kk

如果有神仙改出来了我会给5软妹币,微信支付

2023/3/25 18:41
加载中...