洛谷P1552 [APIO2012] 派遣 [左偏树,树形DP]
忍者
Description
Input
Output
Sample Input
0 3 3
1 3 5
2 2 2
1 2 4
2 3 1
Sample Output
HINT
如果我们选择编号为 1的忍者作为管理者并且派遣第三个和第四个忍者,薪水总和为 4,没有超过总预算4。因为派遣了 2 个忍者并且管理者的领导力为 3,用户的满意度为 2 ,是可以得到的用户满意度的最大值。
分析:
这个题意描述是真的有点迷。。一句话题意:从树中选出一个节点作为管理者,然后在它的子树中(包括它自己)选出若干节点,要求使花费总和小于$m$,并且使得收益最大。
我们可以用左偏树维护点的关系。
除了左右子节点和高度以外,这个左偏树一共还需要维护该节点花费,总花费,总人数三条信息。从根节点开始$dfs$,然后从下往上递归转移。当转移到第$x$个节点时,我们将它与它所有子节点形成的左偏树合并,然后进行判断,将花费大的节点全部弹出知道花费小于等于$m$为止,然后更新答案即可。当然,这里左偏树要建立大根堆,因为小根堆维护花费和不大于$m$会非常麻烦。然后注意一些细节就行了。
Code:
//It is made by HolseLee on 14th Aug 2018
//Luogu.org P1552
#include<bits/stdc++.h>
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
#define Swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
using namespace std; typedef long long ll;
const int N=1e5+;
int n,head[N],size,rt[N];
ll m,c[N],p[N],ans;
struct node{
int to,nxt;
}edge[N<<];
struct Node{
ll sum,val;int ls,rs,height,siz;
}t[N];
struct Leftist{
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(t[y].val>t[x].val)Swap(x,y);
int &r=t[x].rs,&l=t[x].ls;
r=merge(r,y);
if(t[r].height>t[l].height)swap(l,r);
t[x].height=t[r].height+;
t[x].sum=t[l].sum+t[r].sum+t[x].val;
t[x].siz=t[l].siz+t[r].siz+;
return x;
} int delet(int x)
{
return merge(t[x].ls,t[x].rs);
}
}T; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} inline void add(int x,int y)
{
edge[++size].to=y;
edge[size].nxt=head[x];
head[x]=size;
} void dfs(int u,int fa)
{
t[u].val=t[u].sum=c[u];
t[u].ls=t[u].rs=t[u].height=;
t[u].siz=;
rt[u]=u;int v;
for(int i=head[u];i!=-;i=edge[i].nxt){
v=edge[i].to;
if(v==fa)continue;
dfs(v,u);
rt[u]=T.merge(rt[u],rt[v]);
}
while(t[rt[u]].sum>m&&t[rt[u]].siz!=)
rt[u]=T.delet(rt[u]);
ans=Max(ans,t[rt[u]].siz*p[u]);
} int main()
{
n=read();m=read();
int x;
memset(head,-,sizeof(head));
for(int i=;i<=n;++i){
x=read();c[i]=read();p[i]=read();
add(x,i);add(i,x);
}
dfs(,);
printf("%lld",ans);
return ;
}
洛谷P1552 [APIO2012] 派遣 [左偏树,树形DP]的更多相关文章
- [洛谷P1552] [APIO2012]派遣(左偏树)
这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者 ...
- 洛谷P1552 [APIO2012]派遣(左偏树)
传送门 做这题的时候现学了一波左偏树2333(好吧其实是当初打完板子就给忘了) 不难发现肯定是选子树里权值最小的点且选得越多越好 但如果在每一个点维护一个小根堆,我们得一直找知道权值大于m为止,时间会 ...
- [APIO2012]派遣 左偏树
P1552 [APIO2012]派遣 题面 考虑枚举每个节点作为管理者,计算所获得的满意程度以更新答案.对于每个节点的计算,贪心,维护一个大根堆,每次弹出薪水最大的人.这里注意,一旦一个人被弹出,那么 ...
- 2018.07.31洛谷P1552 [APIO2012]派遣(可并堆)
传送门 貌似是个可并堆的模板题,笔者懒得写左偏堆了,直接随机堆水过.实际上这题就是维护一个可合并的大根堆一直从叶子合并到根,如果堆中所有数的和超过了上限就一直弹直到所有数的和不超过上限为止,最后对于当 ...
- [洛谷P1552][APIO2012]派遣
题目大意:有一棵$n$个点的树,和一个费用$m$,每个点有一个费用和价值,请选一个点,再从它的子树中选取若干个点,使得那个点的价值乘上选的点的个数最大,要求选的点费用总和小于等于$m$ 题解:树形$d ...
- 洛谷P4103 [HEOI2014]大工程(虚树 树形dp)
题意 链接 Sol 虚树. 首先建出虚树,然后直接树形dp就行了. 最大最小值直接维护子树内到该节点的最大值,然后合并两棵子树的时候更新一下答案. 任意两点的路径和可以考虑每条边两边的贡献,\(d[x ...
- 洛谷1552 [APIO2012]派遣
洛谷1552 [APIO2012]派遣 原题链接 题解 luogu上被刷到了省选/NOI- ...不至于吧 这题似乎有很多办法乱搞? 对于一个点,如果他当管理者,那选的肯定是他子树中薪水最少的k个,而 ...
- 洛谷 - P1552 - 派遣 - 左偏树 - 并查集
首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. ...
- P1552 派遣 左偏树
左偏树就是一个应该用堆维护的区间,然后需要进行合并操作而发明的算法,其实这个算法没什么难的,和树剖有点像,维护几个数值,然后递归回来的时候就可以修改. 题干: 题目背景 在一个忍者的帮派里,一些忍者们 ...
随机推荐
- 前端PHP入门-033-连接数据库-天龙八步
php检查MySQL的支持是否开启? 若没有看到mysqli扩展在windows服务器下,打开php.ini文件,将php_mysqli.dll打开即可! 注意: 从PHP7开始默认不再支持mysql ...
- libuv的多线程之间传递消息
官网上给出的例子http://nikhilm.github.io/uvbook/threads.html#inter-thread-communication,中文理解在后边 Inter-thread ...
- github访问很慢的问题
公司一直用着svn, 之前也的确用过github的版本管理,但是一直都是可视化的操作 这几天面试了几名前端,问了一下发现他们在之前的公司里都是用git的, 于是今天好好温故了一下怎么用命令行进行一下g ...
- POJ 2318/2398 叉积性质
2318 2398 题意:给出n条线将一块区域分成n+1块空间,再给出m个点,询问这些点在哪个空间里. 思路:由于只要求相对位置关系,而对具体位置不关心,那么易使用叉积性质得到相对位置关系(左侧/右侧 ...
- errno错误号含义
errno0 : Success errno1 : Operation not permitted errno2 : No such file or directory errno3 : No suc ...
- 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环
[题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一 ...
- 我的Mac使用笔记
此篇记录mac使用相关的一些东西,不断更新中... 1.Mac 安装homebrew : https://brew.sh/index_zh-cn.html /usr/bin/ruby -e " ...
- NYOJ 231 Apple Tree (树状数组)
题目链接 描述 There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in t ...
- js布尔值转化
JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值.转换规则是除了下面六个值被转为false,其他值都视为true. undefined null false 0 Na ...
- WHY学习python?
1.python更容易上手 2.功能库很多,不用重复造轮子 3.能干的事情很多(网站开发,爬虫,自动化运维,数据分析,游戏开发,人工智能) 网站开发:豆瓣,知乎 网站框架:django (姜狗) py ...