#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软妹币,微信支付