http://www.lydsy.com/JudgeOnline/problem.php?id=2809

题意:

思路:
最简单的想法就是枚举管理者,在其子树中从薪水低的开始选起,但是每个节点都这样处理的话就会重复计算。比如说,现在有两棵子树y,z已经处理好了,然后有一个顶点x连接着这两棵子树,现在要求的是当x为管理者时的最大满意度,其实没必要再去遍历所有x的子节点,因为y、z已经遍历过了,x所选忍者的肯定在y和z所选的忍者当中,如果它们的薪水和>m,那么就剃去最大的,直到薪水和<m。这样需要处理最大值和子树的合并,可以用左偏树来处理。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. using namespace std;
  5. typedef long long ll;
  6. const int maxn = +;
  7.  
  8. ll n,m;
  9. ll ans;
  10. int master;
  11.  
  12. struct Heap
  13. {
  14. int l,r,dis,sz,root;
  15. ll salary,leading,sum;
  16. } t[maxn];
  17.  
  18. vector<int> g[maxn];
  19.  
  20. int merge(int x, int y)
  21. {
  22. if(x==) return y;
  23. if(y==) return x;
  24. if(t[y].salary>t[x].salary) swap(x,y);
  25. t[x].r = merge(t[x].r,y);
  26. t[x].sum = t[t[x].l].sum + t[t[x].r].sum + t[x].salary;
  27. t[x].sz = t[t[x].l].sz + t[t[x].r].sz + ;
  28. if(t[t[x].l].dis < t[t[x].r].dis) swap(t[x].l,t[x].r);
  29. if(t[x].r == ) t[x].dis = ;
  30. else t[x].dis = t[t[x].r].dis + ;
  31. return x;
  32. }
  33.  
  34. int pop(int &x)
  35. {
  36. x = merge(t[x].l,t[x].r);
  37. }
  38.  
  39. int dfs(int u)
  40. {
  41. for(int i=;i<g[u].size();i++)
  42. {
  43. int v = g[u][i];
  44. dfs(v);
  45. t[u].root = merge(t[u].root,t[v].root);
  46. while(t[t[u].root].sum>m) pop(t[u].root);
  47. }
  48. ans = max(ans, t[t[u].root].sz*t[u].leading);
  49. return ;
  50. }
  51.  
  52. int main()
  53. {
  54. //freopen("in.txt","r",stdin);
  55. scanf("%lld%lld",&n,&m);
  56. for(int i=; i<=n; i++)
  57. {
  58. ll f,s,l;
  59. scanf("%lld%lld%lld",&f,&s,&l);
  60. if(f==) master = i;
  61. t[i].l=t[i].r=t[i].dis = ;
  62. t[i].salary = t[i].sum = s;
  63. t[i].leading = l;
  64. t[i].root = i;
  65. t[i].sz = ;
  66. g[f].push_back(i);
  67. }
  68. ans = ;
  69. dfs(master);
  70. printf("%lld\n",ans);
  71. return ;
  72. }

BZOJ 2809: [Apio2012]dispatching(左偏树)的更多相关文章

  1. 【bzoj2809】[Apio2012]dispatching 左偏树

    2016-05-31  15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...

  2. bzoj2809 [Apio2012]dispatching(左偏树)

    [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 M ...

  3. bzoj2809 [Apio2012]dispatching——左偏树(可并堆)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...

  4. [Apio2012]dispatching 左偏树

    题目描述 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增 ...

  5. [Apio2012]dispatching 左偏树做法

    http://codevs.cn/problem/1763/ 维护子树大根堆,当子树薪水和>m时,删除最贵的点 #include<cstdio> #include<iostre ...

  6. BZOJ 2809: [Apio2012]dispatching(可并堆 左偏树板题)

    这道题只要读懂题目一切好说. 给出nnn个点的一棵树,每一个点有一个费用vvv和一个领导力aaa,给出费用上限mmm.求下面这个式子的最大值ax∗∣S∣ ( S⊂x的子树, ∑iv[i]≤m )\la ...

  7. APIO2012 派遣dispatching | 左偏树

    题目链接:戳我 就是尽可能地选取排名小的,加起来就可以了.然后我们考虑利用一个大根堆,一个一个合并,如果超过派遣的钱,我们就把费用最大的那个忍者丢出队列. 左偏树,作为一个十分优秀的可并堆,我们这道题 ...

  8. BZOJ 2809 APIO2012 dispatching Treap+启示式合并 / 可并堆

    题目大意:给定一棵树,选定一棵子树中的一些点,薪水和不能超过m,求点的数量*子树根节点的领导能力的最大值 考虑对于每一个节点,我们维护一种数据结构,在当中贪心寻找薪金小的雇佣. 每一个节点暴力重建一定 ...

  9. [APIO2012]派遣 左偏树

    P1552 [APIO2012]派遣 题面 考虑枚举每个节点作为管理者,计算所获得的满意程度以更新答案.对于每个节点的计算,贪心,维护一个大根堆,每次弹出薪水最大的人.这里注意,一旦一个人被弹出,那么 ...

随机推荐

  1. linux监控性能和网络的命令

    vmstat查看机器实时的综合情况:load,内存,swap,cpu使用率等方面 procs: r:运行队列中进程数量 b:等待IO的进程数量 memory(内存): swpd:使用虚拟内存大小 fr ...

  2. python添加新的模块

    添加新的模块可以把路径放到环境变量中 或者放到site-packages文件夹下

  3. Python+OpenCV图像处理(三)—— Numpy数组操作图片

    一.改变图片每个像素点每个通道的灰度值 (一) 代码如下: #遍历访问图片每个像素点,并修改相应的RGB import cv2 as cv def access_pixels(image): prin ...

  4. yield的理解

    yield的理解:yield命令是异步两个阶段的分界线需要先对迭代器和生成器进行理解: 迭代器:是一种支持next()操作的对象.它包含一组元素,当执行next()时,返回其中一个元素:当所有元素都被 ...

  5. Java中使用自定义类封装数组,添加类方法实现数据操作

    1.具体见注释 2.后续或有更新 public class MyArray { private long[] array; private int cnt; // 自定义数组类的元素个数 /** 使用 ...

  6. 使用My97DatePicker设置日期的属性示例

    <td>交易日期:</td> <td colspan="3"> <input class="Wdate" id=&qu ...

  7. Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战

    基础知识 class scrapy.spiders.CrawlSpider 这是抓取一般网页最常用的类,除了从Spider继承过来的属性外,其提供了一个新的属性rules,它提供了一种简单的机制,能够 ...

  8. linux的/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow—关于用户和组的配置文件

    1./etc/passwd  存储用户信息 [root@oldboy ~]# head /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bi ...

  9. Python3 解析excel文件

    Python3 解析读取excel文件 一.第三方库 import xlrd 二.代码示例 import xlrd ''' 读取Excel每个sheet的第一列和第二列的值,拼接成json串,写入文件 ...

  10. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)

    接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...