题目大意:有一棵$n$个点的树,和一个费用$m$,每个点有一个费用和价值,请选一个点,再从它的子树中选取若干个点,使得那个点的价值乘上选的点的个数最大,要求选的点费用总和小于等于$m$

题解:树形$dp$,贪心可得选的点一定是费用最少的几个点,可以用可并堆,大根堆,若总费用大于$m$就把堆顶弹掉,直到小于等于$m$,更新答案

卡点:

C++ Code:

#include <algorithm>
#include <cstdio>
#define maxn 100010
int head[maxn], cnt;
struct Edge {
int to, nxt;
} e[maxn];
inline void addedge(int a, int b) {
e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
} long long ans;
int V[maxn], lc[maxn], rc[maxn], dis[maxn];
int sum[maxn], sz[maxn]; inline int update(int x) {
sz[x] = sz[lc[x]] + sz[rc[x]] + 1;
sum[x] = sum[lc[x]] + sum[rc[x]] + V[x];
return x;
}
int merge(int x, int y) {
if (!x || !y) return x | y;
if (V[x] < V[y]) std::swap(x, y);
rc[x] = merge(rc[x], y);
if (dis[rc[x]] > dis[lc[x]]) std::swap(lc[x], rc[x]);
dis[x] = dis[rc[x]] + 1;
return update(x);
}
inline int pop(int x) {return merge(lc[x], rc[x]);} int root, n, m;
int L[maxn];
int dfs(int u, int fa = 0) {
int rt = u;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to, __rt = dfs(v);
rt = merge(rt, __rt);
while (sum[rt] > m) rt = pop(rt);
}
ans = std::max(ans, static_cast<long long> (sz[rt]) * L[u]);
return rt;
}
int main() {
scanf("%d%d", &n, &m); dis[0] = -1;
for (int i = 1, x; i <= n; i++) {
scanf("%d%d%d", &x, V + i, L + i);
sum[i] = V[i], sz[i] = 1;
if (x) addedge(x, i);
else root = i;
}
dfs(root);
printf("%lld\n", ans);
return 0;
}

  

[洛谷P1552][APIO2012]派遣的更多相关文章

  1. 洛谷P1552 [APIO2012] 派遣 [左偏树,树形DP]

    题目传送门 忍者 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都 ...

  2. 2018.07.31洛谷P1552 [APIO2012]派遣(可并堆)

    传送门 貌似是个可并堆的模板题,笔者懒得写左偏堆了,直接随机堆水过.实际上这题就是维护一个可合并的大根堆一直从叶子合并到根,如果堆中所有数的和超过了上限就一直弹直到所有数的和不超过上限为止,最后对于当 ...

  3. 洛谷P1552 [APIO2012]派遣(左偏树)

    传送门 做这题的时候现学了一波左偏树2333(好吧其实是当初打完板子就给忘了) 不难发现肯定是选子树里权值最小的点且选得越多越好 但如果在每一个点维护一个小根堆,我们得一直找知道权值大于m为止,时间会 ...

  4. [洛谷P1552] [APIO2012]派遣(左偏树)

    这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者 ...

  5. 洛谷1552 [APIO2012]派遣

    洛谷1552 [APIO2012]派遣 原题链接 题解 luogu上被刷到了省选/NOI- ...不至于吧 这题似乎有很多办法乱搞? 对于一个点,如果他当管理者,那选的肯定是他子树中薪水最少的k个,而 ...

  6. [luogu P1552] [APIO2012]派遣

    [luogu P1552] [APIO2012]派遣 题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除 ...

  7. [APIO2012]派遣 洛谷P1552 bzoj2809 codevs1763

    http://www.codevs.cn/problem/1763/ https://www.lydsy.com/JudgeOnline/problem.php?id=2809 https://www ...

  8. 题解 洛谷 P1552 【[APIO2012]派遣】

    根据题意,我们不难发现忍者之间的关系是树形结构. 发现答案的统计只是在该节点的子树中,因此我们考虑通过树形\(DP\)来解决问题. 从叶子节点开始,从下往上考虑,因为一个节点的最优答案只与他的领导力和 ...

  9. 洛谷 - P1552 - 派遣 - 左偏树 - 并查集

    首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. ...

随机推荐

  1. Linux 下获取通讯IP

    #!/bin/sh # filename: get_net.sh default_route=$(ip route show) default_interface=$() address=$(ip a ...

  2. Redis系列八 使用Jedis

    使用Jedis jar操作Redis 1.配置redis.conf文件,修改 2.建java工程,加入 jedis jar包 3.代码示例: package com.ntjr.redis; impor ...

  3. 最新flowable研究学习及其汉化flowable6.3中文

    flowable 是activiti的分支,现在感觉比activiti要强大一些,官网是 https://flowable.org/ 下载最新的6.31版本. 放到tomcat下面,汉化需要对flow ...

  4. editText设置最大长度

    xml中可以设置为: <EditText android:layout_width = "fill_parent" android:layout_height = " ...

  5. 新的征程 in ZJU

    争取考上了心仪的学校 并进入了心仪的实验室 但是对我来说,未来将是更多的挑战 首先我觉得我学习能力还是不足,无法做到一天的高效率学习 实验室的方向是可视化,我觉得这个是个非常复杂的方向 数学,pyth ...

  6. lesson 21 Daniel Mendoza

    lesson 21 Daniel Mendoza bare 赤裸的 :boxers fought with bare fists crude 天然的:crude sugar, crude oil 粗俗 ...

  7. python 终极篇 --- form组件 与 modelForm

                                                           form组件                                       ...

  8. kafka stream 低级别的Processor API动态生成拓扑图

    public class KafkaSream { public static void main(String[] args) { Map<String, Object> props = ...

  9. #pragma pack(n)对齐格式

    #pragma pack(n)对齐格式 #pragma pack(n) 是预处理器用来指定对齐格式的指令,表示n对齐.当元素字节小于n时,要扩展到n:若元素字节大于n则占用其实际大小. struct ...

  10. iostat lsof

    转至:http://www.51testing.com/html/48/202848-242043.html 命令总结: 1. top/vmstat 发现 wa%过高,vmstat b >1: ...