1 #include2 #include 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] 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 }
斜堆 合并