这道题只要读懂题目一切好说.

给出nnn个点的一棵树,每一个点有一个费用vvv和一个领导力aaa,给出费用上限mmm.求下面这个式子的最大值ax∗∣S∣ ( S⊂x的子树, ∑iv[i]≤m )\large a_x*|S|\ (\ S\sub x的子树,\ \sum_{i}v[i]\le m\ )ax​∗∣S∣ ( S⊂x的子树, i∑​v[i]≤m )

然后就做一遍dfsdfsdfs,对于一个点维护子树内的所有数的大根堆,如果当前堆的和大于mmm,就把堆顶元素弹出知道小于等于mmm.那么这样一定是最优的,因为子树内每个点在贡献上平等,费用大的就要优先弹出.

然后每个点就把子树的堆合并起来就行了.这里用左偏树实现

CODE

#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
typedef long long LL;
struct lt {
int ls, rs, v, d, sz; LL sum;
}t[MAXN];
vector<int>e[MAXN];
int n, m; LL a[MAXN], ans;
inline void upd(int x) {
if(t[t[x].ls].d < t[t[x].rs].d) swap(t[x].ls, t[x].rs);
t[x].d = t[t[x].rs].d + 1;
t[x].sz = t[t[x].ls].sz + t[t[x].rs].sz + 1;
t[x].sum = t[t[x].ls].sum + t[t[x].rs].sum + t[x].v;
} int merge(int x, int y) {
if(!x || !y) return x + y;
if(t[y].v > t[x].v) swap(x, y);
t[x].rs = merge(t[x].rs, y);
upd(x);
return x;
} inline int pop(int x) {
int l = t[x].ls, r = t[x].rs;
t[x].ls = t[x].rs = t[x].d = 0; t[x].sz = 1;
return merge(l, r);
} inline int dfs(int x, int ff) {
int rt = x;
t[x].d = 0; t[x].sz = 1, t[x].sum = t[x].v;
for(int v, i = 0, siz = e[x].size(); i < siz; ++i)
if((v=e[x][i]) != ff) rt = merge(rt, dfs(v, x));
while(t[rt].sum > m) rt = pop(rt);
ans = max(ans, a[x] * t[rt].sz);
return rt;
}
int main () {
t[0].d = -1; t[0].sz = t[0].sum = 0;
scanf("%d%d", &n, &m);
for(int i = 1, x; i <= n; ++i) {
scanf("%d%d%lld", &x, &t[i].v, &a[i]);
if(x) e[x].push_back(i);
}
dfs(1, 0);
printf("%lld\n", ans);
}

BZOJ 2809: [Apio2012]dispatching(可并堆 左偏树板题)的更多相关文章

  1. 2809: [Apio2012]dispatching 可并堆 左偏树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2809 板子题wa了一下因为输出ans没有lld #include<iostream> ...

  2. bzoj 2809: [Apio2012]dispatching -- 可并堆

    2809: [Apio2012]dispatching Time Limit: 10 Sec  Memory Limit: 128 MB Description 在一个忍者的帮派里,一些忍者们被选中派 ...

  3. BZOJ 2809 [Apio2012]dispatching(斜堆+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2809 [题目大意] 给出一棵树,求出每个点有个权值,和一个乘算值,请选取一棵子树, 并 ...

  4. 【BZOJ 1455】 1455: 罗马游戏 (可并堆-左偏树+并查集)

    1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那 ...

  5. BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)

    左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...

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

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

  7. BZOJ 2809: [Apio2012]dispatching [斜堆]

    题意:主席树做法见上一题 我曾发过誓再也不写左偏树(期末考试前一天下午5个小时没写出棘手的操作) 于是我来写斜堆啦 从叶子往根合并,维护斜堆就行了 题目连拓扑序都给你了... 说一下斜堆的操作: 合并 ...

  8. BZOJ 2809: [Apio2012]dispatching(左偏树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题意: 思路:最简单的想法就是枚举管理者,在其子树中从薪水低的开始选起,但是每个节点都这样处理 ...

  9. BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )

    枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...

随机推荐

  1. 使用echo $? 查看命令成功执行的原理

    转载于:http://blog.csdn.net/cmzsteven/article/details/49049387 在进行源代码编译,或者执行命令无法确认所执行的命令是否成功执行的情况下,我们都会 ...

  2. PTA (Advanced Level)1035.Password

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  3. THUSC2016

    补退选 Luogu LOJ BZOJ 比较裸. 建一棵Trie树,记录一下每个节点的\(sum\)表示经过该点的字符串个数,每次暴力插入.删除. 同时每个节点维护一个vector,记录一下这个点的\( ...

  4. python 文件写入

    def write_file(): """ 文件写入""" file_name = "wri2te_test.txt" ...

  5. 关于vs code文本编辑器的快捷键

    另一篇编辑器Sublime Text下载.使用教程.插件推荐说明.全套快捷键 基础编辑 快捷键 作用 Ctrl+X 剪切 Ctrl+C 复制 Ctrl+Shift+K 删除当前行 Ctrl+Enter ...

  6. Codeforces 1236B. Alice and the List of Presents

    传送门 显然每种礼物是互相独立的,一个礼物的分配不会影响另一个礼物 对于某个礼物 $x$ , 对于每个盒子来说,要么选要么不选,那么可以看成长度为 $m$ 的二进制序列 这个序列第 $i$ 位的数就代 ...

  7. python2.7学习笔记——菜鸟教程

    标准数据类型 Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典) list = [ 'runoob', 786 , 2.23, 'joh ...

  8. linux常用的bash指令

    文本处理 awk sed grep sort uniq cat cut echo fmt tr nl egrep fgrep wc 进程监视 ps top htop atop lsof 网络 nmap ...

  9. -bash: fork: retry: 没有子进程

    今天遇到一个问题 -bash: fork: retry: 没有子进程 解决方法 设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:   ulimit -u 10 ...

  10. Cognex925B的使用方法

    一.Cognex925B的简介                                           Cognex925B是一款线激光扫描传感器,利用激光三角的原理测量Z方向的断差. 二 ...