虽然过了,但是还有一些疑问
查看原帖
虽然过了,但是还有一些疑问
376997
Harry27182SDream楼主2022/2/1 16:36
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans,dis[100005],l[100005],r[100005],size[100005],sum[100005];
int root[100005],fa[100005],cost[100005],val[100005];
int merge(int x,int y)
{
	if(!x)return y;
	if(!y)return x;
	if(cost[y]>cost[x])swap(x,y);
	r[x]=merge(r[x],y);
	if(dis[r[x]]>dis[l[x]])swap(l[x],r[x]);
	if(!r[x])dis[x]=0;
	else dis[x]=dis[r[x]]+1;
	return x;
} 
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld%lld",&fa[i],&cost[i],&val[i]);
		size[i]=1;root[i]=i;sum[i]=cost[i];
		ans=max(ans,val[i]);//此处是干什么的,为什么不加这一句会 WA 掉两个点
	}
	for(int i=n;i>1;i--)
	{
		root[fa[i]]=merge(root[i],root[fa[i]]);
		size[fa[i]]+=size[i];
		sum[fa[i]]+=sum[i];
		while(sum[fa[i]]>m)//这里到 qwq 处代码和注释掉的代码有什么区别,为什么使用注释掉的代码会 MLE
		{
			size[fa[i]]--;
			sum[fa[i]]-=cost[root[fa[i]]];
			root[fa[i]]=merge(l[root[fa[i]]],r[root[fa[i]]]);
		}
		ans=max(ans,size[fa[i]]*val[fa[i]]);//qwq
	}
	/*for(int i=1;i<=n;i++)
	{
		while(sum[i]>m)
		{
			size[i]--;
			sum[i]-=cost[root[i]];
			root[i]=merge(l[root[i]],r[root[i]]);
		}
		ans=max(ans,size[i]*val[i]);
	}*/
	printf("%lld",ans);
	return 0;
}
2022/2/1 16:36
加载中...