码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 2809 dispatching

时间:2018-11-07 11:24:45      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:vector   while   max   code   cto   tchar   dispatch   names   bcf   

题目大意:

一棵树中 对于一个点在子树中取一些点使这些点的权值之和$\le m$ 使选的点的数量尽量大

一个点的答案为这个尽可能大的答案$\times$这个点的第二权值 求所有点的答案的最大值

思路:

明显对于每个点的子树中选权值尽可能小的点 可以维护一个堆

维护一个可并堆 向上合并即可

技术分享图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<queue>
 8 #include<vector>
 9 #include<set>
10 #include<map> 
11 #define inf 2139062143
12 #define ll long long
13 #define MOD 1000000007
14 #define MAXN 100100
15 using namespace std;
16 inline int read()
17 {
18     int x=0,f=1;
19     char ch=getchar();
20     while(!isdigit(ch)) {if(ch==-) f=-1;ch=getchar();}
21     while(isdigit(ch)) {x=x*10+ch-0;ch=getchar();}
22     return x*f;
23 }
24 int n,m,L[MAXN],val[MAXN],sz[MAXN],dis[MAXN],ls[MAXN],rs[MAXN],rt[MAXN];
25 int fst[MAXN],nxt[MAXN<<1],to[MAXN<<1],cnt;
26 ll sum[MAXN],ans;
27 void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;}
28 int merge(int x,int y)
29 {
30     if(!(x*y)) return x+y;
31     if(val[x]<val[y]) swap(x,y);
32     rs[x]=merge(rs[x],y);
33     if(dis[ls[x]]<dis[rs[x]]) swap(ls[x],rs[x]);
34     return x;
35 }
36 void dfs(int x,int fa)
37 {
38     sz[x]=1,rt[x]=x,sum[x]=val[x];
39     for(int i=fst[x];i;i=nxt[i])
40         if(to[i]!=fa)
41         {
42             dfs(to[i],x);
43             sz[x]+=sz[to[i]],sum[x]+=sum[to[i]];
44             rt[x]=merge(rt[x],rt[to[i]]);
45         }
46     while(sum[x]>m)
47     {
48         sum[x]-=val[rt[x]],sz[x]--;
49         rt[x]=merge(rs[rt[x]],ls[rt[x]]);
50     }
51     ans=max(ans,(ll)L[x]*sz[x]);
52 }
53 int main()
54 {
55     n=read(),m=read();int x;
56     for(int i=1;i<=n;i++)
57     {
58         x=read(),val[i]=read(),L[i]=read();
59         if(x) add(i,x),add(x,i);
60     }
61     dfs(1,0);printf("%lld",ans);
62 }
View Code

 

bzoj 2809 dispatching

标签:vector   while   max   code   cto   tchar   dispatch   names   bcf   

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/9920534.html

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