[APIO2012]派遣 左偏树
P1552 [APIO2012]派遣
考虑枚举每个节点作为管理者,计算所获得的满意程度以更新答案。对于每个节点的计算,贪心,维护一个大根堆,每次弹出薪水最大的人。这里注意,一旦一个人被弹出,那么不再可能出现在其祖先们的最优解里(废话),所以使用可并堆左偏树优化复杂度。
#include <cstdio>
#include <algorithm>
#define MAXN 100010
#define MAX(A,B) ((A)>(B)?(A):(B))
#define LL long long
using namespace std;
int n,m,rot;
LL ans;
int head[MAXN],nxt[MAXN*2],vv[MAXN*2],tot;
inline void add_edge(int u, int v){
vv[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
int val[MAXN],lead[MAXN],sl[MAXN],sr[MAXN],dis[MAXN];
int merge(int a, int b){
if(a==0||b==0) return a+b;
if(val[a]<val[b]) swap(a, b);
sr[a]=merge(sr[a], b);
if(dis[sl[a]]<dis[sr[a]]) swap(sl[a], sr[a]);
dis[a]=dis[sr[a]]+1;
return a;
}
int root[MAXN],cnt,sz[MAXN],sum[MAXN];
void dfs(int u){
root[u]=u;sz[u]=1;sum[u]=val[u];
for(int i=head[u];i;i=nxt[i]){
int v=vv[i];
dfs(v);
root[u]=merge(root[u], root[v]);
sum[u]+=sum[v];
sz[u]+=sz[v];
while(sum[u]>m){
sum[u]-=val[root[u]];
sz[u]-=1;
root[u]=merge(sl[root[u]], sr[root[u]]);
}
}
ans=MAX(ans, (LL)sz[u]*lead[u]);
}
int main()
{
scanf("%d %d", &n, &m);
for(int i=1;i<=n;++i){
int v;scanf("%d", &v);
if(v==0) rot=i;
add_edge(v,i);
scanf("%d %d", &val[i], &lead[i]);
}
dfs(rot);
printf("%lld", ans);
return 0;
}
[APIO2012]派遣 左偏树的更多相关文章
- 洛谷P1552 [APIO2012] 派遣 [左偏树,树形DP]
题目传送门 忍者 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都 ...
- [洛谷P1552] [APIO2012]派遣(左偏树)
这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者 ...
- 【bzoj2809】[Apio2012]dispatching 左偏树
2016-05-31 15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...
- bzoj2809 [Apio2012]dispatching(左偏树)
[Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 M ...
- 洛谷 - P1552 - 派遣 - 左偏树 - 并查集
首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. ...
- bzoj2809 [Apio2012]dispatching——左偏树(可并堆)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...
- P1552 派遣 左偏树
左偏树就是一个应该用堆维护的区间,然后需要进行合并操作而发明的算法,其实这个算法没什么难的,和树剖有点像,维护几个数值,然后递归回来的时候就可以修改. 题干: 题目背景 在一个忍者的帮派里,一些忍者们 ...
- 【bzoj2809】派遣 (左偏树)
传送门 题目分析 每个节点都是一颗(大根堆)左偏树,先按bfs序存入数组,然后倒着从底层开始:如果当前节点的子树sum > m 那么就把根节点删去,然后统计更新答案,并将这棵树和父节点合并. c ...
- [Apio2012]dispatching 左偏树
题目描述 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增 ...
随机推荐
- js 自定义加减乘除方法(防止js自身计算错误)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- hdu.. 基础二分的精度问题
#include<stdio.h>#include<iostream>using namespace std;double f(double x){ return 8*x*x* ...
- php 调用 webservice 中文乱码解决方案
webservice中有中文的话,返回的值就变成了乱码.查看了一下response的结果,是正确的.应该是用nusoap处理的时候出现了问题. 更改了nusoap.php两个地方就OK了. 更改的地方 ...
- SSH和SSM对比异同点、各自优势
1SSH和SSM定义SSH 通常指的是 Struts2 做控制器(Action),Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制器(co ...
- springboot笔记04——读取配置文件+使用slf4j日志
前言 springboot常用的配置文件有yml和properties两种,当然有必要的时候也可以用xml.我个人更加喜欢用yml,所以我在这里使用yml作为例子.yml或properties配置文件 ...
- css中哪些属性会脱离文档流
一共有三个属性会使元素脱离文档流: (1)浮动 (2)绝对定位 (3)固定定位 元素脱离文档流会导致父元素高度塌陷,要修复高度塌陷问题,可以将子元素与父元素放在同一个BFC中
- c语言二进制、八进制、十六进制
int binary = 0b01000010; //二进制 printf("%d\n", binary); //十进制 printf("0x%x\n", 0x ...
- sql将查询结果的某个字段赋值给另一个字段
Update a set a.NickName=b.name FROM AccountsInfo a, TT b where a.UserID=b.userId 必须要有关联的两个表
- MongoDB 无法启动
提示 mongodb Mongod complains that there is no /data/db folder!! 解决方法:http://stackoverflow.com/questio ...
- 理解JVM之java内存模型
java虚拟机规范中试图定义一种java内存模型(JMM)来屏蔽掉各种硬件和操作系统内存访问差异,以实现让java程序在各种平台都能打到一致的内存访问效果.所以java内存模型的主要目标是定义程序中各 ...