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

给出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. [转帖]Docker 入门教程

    Docker 入门教程 http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 自己学的还是太肤浅啊.. 作者: 阮一峰 日期: 201 ...

  2. python+requests 请求响应文本出错返回“登录超时”

    Python+requests请求响应:"msg":"登录过时" 1.出错原代码: import requests import json#页面按条件搜索返回相 ...

  3. length 和 size 区分

    ​ 总是混淆length和size,今天专门区分一下 1.在java代码(.java)中 1.length属性是针对Java中的数组来说的,要求数组的长度可以用其length属性: 2.length( ...

  4. hdu4706

    #include<string.h> #include<stdio.h> int main() { int a,b,c,d,i,j,n,m; ][]; ,j=; a<=; ...

  5. redis 学习(19)-- RDB与AOF的抉择

    RDB与AOF的抉择 1.RDB VS AOF RDB AOF 启动优先级 低 高 体积 小 大 恢复速度 快 慢 数据安全性 容易丢数据 根据策略决定 轻重 重 轻 2.RDB的最佳策略 关闭RDB ...

  6. 查询进程内存,cpu占用情况。僵尸进程

    查使用内存最多的5个进程:ps aux | head -1 && ps aux | grep -v USER | sort -nr -k 4 | head -5 查使用CPU最多的5个 ...

  7. asp.net 5.图片和验证码

    1.基本画图 //给用户创建一张图片,并且保持一张图片. //创建一个画布 , )) { //绘画布创建一个画笔 using (Graphics g = Graphics.FromImage(map) ...

  8. c# 后台隐式使用webBrowser

    c#不使用 webBrowser 控件, 在后台加载html流 private void button1_Click(object sender, EventArgs e) { string urlP ...

  9. dev gridview表格按钮

    固定列的位置 添加按钮控件位置,使用buttonEdit 添加按钮 按钮属性设置 按钮设置后的效果 //注册按钮事件 this.ribtndata.ButtonClick += new DevExpr ...

  10. centos 配置rsync+inotify数据实时同步

    何为rsync? 定义: rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,非常适用于异地备份 何为源端和发起端? 在远程同步过程中,负责发起rs ...