bzoj 2809: [Apio2012]dispatching

时间:2021-02-25 05:39:24
 #include<cstdio>
#include<algorithm>
#define M 1000005
using namespace std;
long long ans,sum[M],size[M];
int tot,n,m,head[M],next[M],u[M],c[M],L[M],cnt,root[M];
int l[M],r[M],v[M];
void jia(int a1,int a2)
{
cnt++;
next[cnt]=head[a1];
u[cnt]=a2;
head[a1]=cnt;
return;
}
int he(int a1,int a2)
{
if(!a1||!a2)
return a1+a2;
if(v[a1]<v[a2])
swap(a1,a2);
r[a1]=he(r[a1],a2);
swap(l[a1],r[a1]);
return a1;
}
void dfs(int a1)
{
root[a1]=++tot;
v[tot]=c[a1];
sum[a1]=c[a1];
size[a1]=;
for(int i=head[a1];i;i=next[i])
{
dfs(u[i]);
sum[a1]+=sum[u[i]];
size[a1]+=size[u[i]];
root[a1]=he(root[a1],root[u[i]]);
}
for(;sum[a1]>m;)
{
sum[a1]-=v[root[a1]];
size[a1]--;
root[a1]=he(l[root[a1]],r[root[a1]]);
}
ans=max(ans,size[a1]*L[a1]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
int a1;
scanf("%d%d%d",&a1,&c[i],&L[i]);
jia(a1,i);
}
dfs();
printf("%lld",ans);
return ;
}

斜堆 合并