1 #include<cstdio> 2 #include<algorithm> 3 #define M 1000005 4 using namespace std; 5 long long ans,sum[M],size[M]; 6 int tot,n,m,head[M],next[M],u[M],c[M],L[M],cnt,root[M]; 7 int l[M],r[M],v[M]; 8 void jia(int a1,int a2) 9 { 10 cnt++; 11 next[cnt]=head[a1]; 12 u[cnt]=a2; 13 head[a1]=cnt; 14 return; 15 } 16 int he(int a1,int a2) 17 { 18 if(!a1||!a2) 19 return a1+a2; 20 if(v[a1]<v[a2]) 21 swap(a1,a2); 22 r[a1]=he(r[a1],a2); 23 swap(l[a1],r[a1]); 24 return a1; 25 } 26 void dfs(int a1) 27 { 28 root[a1]=++tot; 29 v[tot]=c[a1]; 30 sum[a1]=c[a1]; 31 size[a1]=1; 32 for(int i=head[a1];i;i=next[i]) 33 { 34 dfs(u[i]); 35 sum[a1]+=sum[u[i]]; 36 size[a1]+=size[u[i]]; 37 root[a1]=he(root[a1],root[u[i]]); 38 } 39 for(;sum[a1]>m;) 40 { 41 sum[a1]-=v[root[a1]]; 42 size[a1]--; 43 root[a1]=he(l[root[a1]],r[root[a1]]); 44 } 45 ans=max(ans,size[a1]*L[a1]); 46 } 47 int main() 48 { 49 scanf("%d%d",&n,&m); 50 for(int i=1;i<=n;i++) 51 { 52 int a1; 53 scanf("%d%d%d",&a1,&c[i],&L[i]); 54 jia(a1,i); 55 } 56 dfs(1); 57 printf("%lld",ans); 58 return 0; 59 }
斜堆 合并