码迷,mamicode.com
首页 > Windows程序 > 详细

2809: [Apio2012]dispatching 可并堆 左偏树

时间:2018-03-31 10:57:45      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:输出   可并堆   cst   namespace   one   view   head   没有   open   

https://www.lydsy.com/JudgeOnline/problem.php?id=2809

板子题wa了一下因为输出ans没有lld

技术分享图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 const int maxn=100100;
 9 int n,m;
10 int ch[maxn][2]={},siz[maxn]={},sum[maxn]={},cnt[maxn]={},rt[maxn]={};
11 int fa[maxn]={},val[maxn]={},l[maxn]={};
12 int y[maxn],nex[maxn]={},head[maxn]={},tot=0;
13 long long ans=0;
14 void init(int x,int yi){
15     y[++tot]=yi;nex[tot]=head[x];head[x]=tot;
16 }
17 void updata(int x){
18     siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
19     sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+val[x];
20 }
21 int merge(int x,int y){
22     if(x==0)return y;if(y==0)return x;
23     if(val[x]<val[y])swap(x,y);
24     ch[x][1]=merge(ch[x][1],y);
25     if(cnt[ch[x][1]]>cnt[ch[x][0]])
26         swap(ch[x][1],ch[x][0]);
27     cnt[x]=cnt[ch[x][1]]+1;
28     updata(x);
29     return x;
30 }
31 void dfs(int x){
32     for(int i=head[x];i;i=nex[i]){
33         dfs(y[i]);
34         rt[x]=merge(rt[x],rt[y[i]]);
35         while(sum[rt[x]]>m){rt[x]=merge(ch[rt[x]][0],ch[rt[x]][1]);}
36     }ans=max(ans,(long long)l[x]*(long long)siz[rt[x]]);
37 }
38 int main(){
39     scanf("%d%d",&n,&m);
40     for(int i=1;i<=n;i++){
41         scanf("%d%d%d",&fa[i],&val[i],&l[i]);
42         sum[i]=val[i];rt[i]=i;siz[i]=1;
43         if(fa[i])init(fa[i],i);
44     }
45     dfs(1);
46     printf("%lld\n",ans);
47     return 0;
48 }
View Code

 

2809: [Apio2012]dispatching 可并堆 左偏树

标签:输出   可并堆   cst   namespace   one   view   head   没有   open   

原文地址:https://www.cnblogs.com/137shoebills/p/8681153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!