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

题意:

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

 #include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = +; ll n,m;
ll ans;
int master; struct Heap
{
int l,r,dis,sz,root;
ll salary,leading,sum;
} t[maxn]; vector<int> g[maxn]; int merge(int x, int y)
{
if(x==) return y;
if(y==) return x;
if(t[y].salary>t[x].salary) swap(x,y);
t[x].r = merge(t[x].r,y);
t[x].sum = t[t[x].l].sum + t[t[x].r].sum + t[x].salary;
t[x].sz = t[t[x].l].sz + t[t[x].r].sz + ;
if(t[t[x].l].dis < t[t[x].r].dis) swap(t[x].l,t[x].r);
if(t[x].r == ) t[x].dis = ;
else t[x].dis = t[t[x].r].dis + ;
return x;
} int pop(int &x)
{
x = merge(t[x].l,t[x].r);
} int dfs(int u)
{
for(int i=;i<g[u].size();i++)
{
int v = g[u][i];
dfs(v);
t[u].root = merge(t[u].root,t[v].root);
while(t[t[u].root].sum>m) pop(t[u].root);
}
ans = max(ans, t[t[u].root].sz*t[u].leading);
return ;
} int main()
{
//freopen("in.txt","r",stdin);
scanf("%lld%lld",&n,&m);
for(int i=; i<=n; i++)
{
ll f,s,l;
scanf("%lld%lld%lld",&f,&s,&l);
if(f==) master = i;
t[i].l=t[i].r=t[i].dis = ;
t[i].salary = t[i].sum = s;
t[i].leading = l;
t[i].root = i;
t[i].sz = ;
g[f].push_back(i);
}
ans = ;
dfs(master);
printf("%lld\n",ans);
return ;
}

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. c# ref和out参数

    向方法传递参的时候,对应的参数通常会用实参的拷贝来初始化.就是说随便在方法内部进行怎样的修改,都不会影响作为参数传递的变量的原始值. 通过上面的例子我们可以看出来,如果一个方法的参数是引用类型,那么使 ...

  2. 外网上传到NAS速度很慢是什么情况?上行1M都不到,但是测试有4M

    外网上传到NAS速度很慢是什么情况?上行1M都不到,但是测试有4M NAS可以将自己的影片,图片,音乐都放在NAS中.在家中就能无线共享了.在其他地方要下载自己nas里的影片,下载速度主要取决于家里宽 ...

  3. AtCoder Beginner Contest 086 (ABCD)

    A - Product 题目链接:https://abc086.contest.atcoder.jp/tasks/abc086_a Time limit : 2sec / Memory limit : ...

  4. kivy 小demo

    from kivy.lang.builder import Builder from kivy.uix.boxlayout import BoxLayout from kivy.app import ...

  5. MD5与SHA散列单项加密

    MD5 MD5的英文全称是Message Digest Algorithm MD5,译为消息摘要算法第五版,是众多哈希算法中的一种(哈希算法是一种可以将任意长度的输入转化为固定长度输出的算法).因此M ...

  6. Spring Boot(十三):spring boot小技巧

    Spring Boot(十三):spring boot小技巧 一.初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用Jpa,另外一种是Spring JDB ...

  7. Java并发编程73道面试题及答案 —— 面试稳了

    今天主要整理一下 Java 并发编程在面试中的常见问题,希望对需要的读者有用. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任 ...

  8. Summarization of Tech Interviews

    Summarization of Tech Interviews(技术面试总结) 手心网(2015) Q1. 解释一下 TCP/IP 协议之滑动窗口? 滑动窗口协议的维基:https://en.wik ...

  9. 动态规划之139 Word Break

    题目链接:https://leetcode-cn.com/problems/word-break/ 参考链接:https://blog.csdn.net/c_flybird/article/detai ...

  10. topcoder srm 335 div1

    problem1 link 直接模拟即可. import java.util.*; import java.math.*; import static java.lang.Math.*; public ...