BZOJ_2809_[Apio2012]dispatching_可并堆
BZOJ_2809_[Apio2012]dispatching_可并堆
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 ,是可以得到的用户满意度的最大值。
题目可以简化成这样:
给出一棵 $n$ 个点以 $1$ 为根的有根树,每个点有代价 $ci$ 和价值 $Li$ 。对于某个点,从它子树中选出代价和不超过 $m$ 的一些点,可以获得 点数×当前点的价值 的收益。求最大收益。
对于以每个点为根的子树,一定是优先选代价小的,并且尽可能的多选。
每个节点维护一个可并堆(大根),从下至上合并,每次当总和大于$m$ 时弹出堆顶元素。
为了方便每个点记录一下堆顶(左偏树的根)$root[x]$ 。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
typedef long long ll;
int n,m,head[N],to[N<<1],nxt[N<<1],val[N],cnt,ls[N],rs[N],dis[N],siz[N];
int rt,c[N],l[N],root[N];
ll sum[N],ans;
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
int merge(int x,int y) {
if(!x) return y;
if(!y) return x;
if(c[x]<c[y]) swap(x,y);
rs[x]=merge(rs[x],y);
if(dis[ls[x]]<dis[rs[x]]) swap(ls[x],rs[x]);
dis[x]=dis[rs[x]]+1;
return x;
}
void dfs(int x) {
int i;
root[x]=x; sum[x]=c[x]; siz[x]=1;
for(i=head[x];i;i=nxt[i]) {
dfs(to[i]);
sum[x]+=sum[to[i]],siz[x]+=siz[to[i]],root[x]=merge(root[x],root[to[i]]);
}
while(sum[x]>m) {
sum[x]-=c[root[x]]; siz[x]--; root[x]=merge(ls[root[x]],rs[root[x]]);
}
ans=max(ans,1ll*l[x]*siz[x]);
}
int main() {
dis[0]=-1;
int i,x;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) {
scanf("%d%d%d",&x,&c[i],&l[i]);
if(!x) rt=i;
else add(x,i);
}
dfs(rt);
printf("%lld\n",ans);
}
BZOJ_2809_[Apio2012]dispatching_可并堆的更多相关文章
- 【BZOJ2809】[Apio2012]dispatching 可并堆
[BZOJ2809][Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 M ...
- BZOJ2809 [Apio2012]dispatching 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2809 题意概括 n个点组成一棵树,每个点都有一个领导力和费用,可以让一个点当领导,然后在这个点的子 ...
- bzoj 2809: [Apio2012]dispatching -- 可并堆
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MB Description 在一个忍者的帮派里,一些忍者们被选中派 ...
- BZOJ 2809 [Apio2012]dispatching(斜堆+树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2809 [题目大意] 给出一棵树,求出每个点有个权值,和一个乘算值,请选取一棵子树, 并 ...
- [APIO2012]派遣 可并堆(左偏树)
没啥说的,自底向上合并大根堆即可. 一边合并,一边贪心弹堆顶直到堆的总和不大于预算. Code: #include <cstdio> #include <algorithm> ...
- [APIO2012]派遣 可并堆
Background 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. Description 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者 ...
- 2809: [Apio2012]dispatching 可并堆 左偏树
https://www.lydsy.com/JudgeOnline/problem.php?id=2809 板子题wa了一下因为输出ans没有lld #include<iostream> ...
- 浅谈左偏树在OI中的应用
Preface 可并堆,一个听起来很NB的数据结构,实际上比一般的堆就多了一个合并的操作. 考虑一般的堆合并时,当我们合并时只能暴力把一个堆里的元素一个一个插入另一个堆里,这样复杂度将达到\(\log ...
- 数据结构,可并堆(左偏树):COGS [APIO2012] 派遣
796. [APIO2012] 派遣 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且 ...
随机推荐
- intersection of two linked lists.(两个链表交叉的地方)
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- PLSQL Developer使用技巧
本文由liuyk80贡献 ·PL/SQL Developer 使用技巧 1.PL/SQL Developer 记住登陆密码 在使用 PL/SQL Developer 时,为了工作方便希望 PL/SQL ...
- 你必须知道的261个Java语言问题
1. Java语言的运行机制: Java既不是编译型语言也不是解释型语言,它是编译型和解释型语言的结合体.首先采用通用的java编译器将Java源程序编译成为与平台无关的字节码文件(class文件), ...
- JVM内存详解-阅读笔记
- MySQL/MariaDB的锁
本文目录: 1.MariaDB/MySQL事务提交的方式 2.MariaDB/MySQL中的锁简介 2.1 不同存储引擎支持的锁级别 2.2 锁类型 2.3 锁兼容性 3.MyISAM的表级锁(loc ...
- Js 浅克隆详解
浅克隆:不仅赋值,而且赋予了内存地址深度克隆:赋值,内存地址不同var a = [1,2,3]; var b = a; a = [4,5,6]; alert(b); //[1,2,3] 面试时被问到这 ...
- codeforces——961C. Chessboard
本文是博主原创文章,未经允许不得转载. 我在csdn也同步发布了此文,链接 https://blog.csdn.net/umbrellalalalala/article/details/7989225 ...
- 用calc()绘制手机图案解锁的九宫格样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用MongoDB存储集合的一些问题
这两天在工作中被Mongo集合存储给整得头大,当然也是我的认知太浅,所以下面我来分享下我所遇到的这个问题希望有大佬能给出更好的解决方案, 1.需求: 存储一个从前端接收未知数据类型的集合 例: 由于是 ...
- HTML学习笔记:1.基础概念
①HTML:Hypertext Markup Language,即超文本标记语言,文件由标记组成 ②HTML发展史 (几个重要节点): 1993(IETF):HTML 1.0 1995(W3C): ...