[APIO2012]派遣 可并堆(左偏树)
没啥说的,自底向上合并大根堆即可.
一边合并,一边贪心弹堆顶直到堆的总和不大于预算.
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 100000 + 5
#define ll long long
using namespace std;
int head[maxn],to[maxn],nex[maxn],cnt,root;
int n;
int siz[maxn],ch[maxn][2],dis[maxn];
ll m,lead[maxn],cost[maxn],ans,sumv[maxn],val[maxn];
void addedge(int u,int v) { nex[++cnt] = head[u],head[u] = cnt,to[cnt] = v; }
int merge(int a,int b){
if(!a || !b) return a + b;
if(val[a] < val[b]) swap(a,b);
ch[a][1] = merge(ch[a][1],b);
if(dis[ch[a][1]] > dis[ch[a][0]]) swap(ch[a][1],ch[a][0]);
dis[a] = dis[ch[a][0]] + 1;
sumv[a] = val[a] + sumv[ch[a][0]] + sumv[ch[a][1]];
siz[a] = siz[ch[a][0]] + siz[ch[a][1]] + 1;
return a;
}
void pop(int &a){
int t = merge(ch[a][0],ch[a][1]);
siz[a] = sumv[a] = val[a] = ch[a][0] = ch[a][1] = 0;
a = t;
}
int dfs(int u){
int rt = u;
val[rt] = cost[u];
siz[rt] = 1;
sumv[rt] = val[rt];
for(int i = head[u]; i ; i = nex[i]){
rt = merge(rt,dfs(to[i]));
while(sumv[rt] > m) pop(rt);
}
//printf("%d %d\n",u,siz[rt]);
ans = max(ans,siz[rt] * lead[u]);
return rt;
}
int main(){
//setIO("input");
scanf("%d%lld",&n,&m);
for(int i = 1;i <= n;++i) {
int a;
scanf("%d%lld%lld",&a,&cost[i],&lead[i]);
if(a == 0) root = i;
else addedge(a,i);
}
dfs(root);
printf("%lld",ans);
return 0;
}
[APIO2012]派遣 可并堆(左偏树)的更多相关文章
- 2809: [Apio2012]dispatching 可并堆 左偏树
		https://www.lydsy.com/JudgeOnline/problem.php?id=2809 板子题wa了一下因为输出ans没有lld #include<iostream> ... 
- BZOJ 2809: [Apio2012]dispatching(可并堆 左偏树板题)
		这道题只要读懂题目一切好说. 给出nnn个点的一棵树,每一个点有一个费用vvv和一个领导力aaa,给出费用上限mmm.求下面这个式子的最大值ax∗∣S∣ ( S⊂x的子树, ∑iv[i]≤m )\la ... 
- 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)
		1367: [Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Ou ... 
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)
		2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ... 
- USACO Running Away From the Barn /// 可并堆 左偏树维护大顶堆
		题目大意: 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于m的点有多少个 左偏树 https://blog.csdn.net/pengwill97/article/details/82 ... 
- BZOJ1367 [Baltic2004]sequence 堆 左偏树
		欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1367 题意概括 Description Input Output 一个整数R 题解 http:// ... 
- BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆
		欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ... 
- 【BZOJ 1455】 1455: 罗马游戏 (可并堆-左偏树+并查集)
		1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那 ... 
- 数据结构,可并堆(左偏树):COGS [APIO2012] 派遣
		796. [APIO2012] 派遣 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且 ... 
- BZOJ 2333: [SCOI2011]棘手的操作 可并堆 左偏树 set
		https://www.lydsy.com/JudgeOnline/problem.php?id=2333 需要两个结构分别维护每个连通块的最大值和所有连通块最大值中的最大值,可以用两个可并堆实现,也 ... 
随机推荐
- ddk安装失败后的处理
			7600.16385.1版本的DDK,在xp的本上死活按不上,怎么办呢?自己就把其他机器上安装的DDK目录,拷贝过来. 怎么建编译环境呢? 查看x86 Checked Build Environmen ... 
- .net基础总复习(3)
			第三天 2.单例模式 1) 将构造函数私有化 2) 提供一个静态方法,返回一个对象 3) 创建一个单例 3.XML 可扩展的标记语言 XML:存储数据 注意: XML严格区分大小写,并且成对出现 ... 
- df与du查看磁盘空间使用不一致的解决方法
			近一段时间,某台服务器的磁盘空间使用不太正常,与其他的服务器相比,严重超出磁盘空间使用 使用df与du相关命令查看,具体结果如下: du -hFilesystem Size Used A ... 
- mysql  linux查看配置文件my.cnf位置
			原文:mysql linux查看配置文件my.cnf位置 命令: mysql --help | grep 'Default options' -A 1 
- jquery weui ajax滚动加载更多
			手机端使用jquery weui制作ajax滚动加载更多. 演示地址:http://wx.cnkfk.com/nuol/static/fpage.html 代码: <!DOCTYPE html& ... 
- jquery在文本框之后添加红*
			var addHtml="<span class='text_red'>*</span>";function req(re){ if(re.parent(& ... 
- HDU 1521
			指数型生成函数.做这题时,回去看看组合数学才知道,指数生成函数求的就是多重集合的r排列数. #include <iostream> #include <cstdio> #inc ... 
- Android Java 程序员必备开发工具
			对于Java,有两种截然不同的观点:一种认为Java是最简单功能最强大的编程语言之一,另一种则表示这种编程语言既难用又复杂. 下面这些工具或许功能和作用不同,但是有着一个共同的主旨,那就是——它们都是 ... 
- IntelliJ IDEA could not autowire no beans of  'Decoder'
			IntelliJ IDEA could not autowire no beans of 'Decoder' 学习了:http://blog.csdn.net/u012453843/article/ ... 
- Rails内存的问题 Java内存情况
			Rails内存的问题 Java内存情况 一个txt文件,100M,300万行,都是坐标数据: 需要进行坐标的变换.计算.比较: 在Rails中使用Ruby进行计算,会导致内存超过1.5G,最后溢出而亡 ... 
