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

给出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);
}

最新文章

  1. SQL数据库之DQL
  2. java list去重
  3. 从零开始使用Jenkins来构建Docker容器(Ubuntu 14.04)
  4. CF 115B Lawnmower(贪心)
  5. Force.com微信开发系列(二)用户消息处理
  6. 利用eclipse抽取 代码片段为方法
  7. 用户控件UserControl图片资源定位(一)---Xaml引用图片
  8. 标准Web系统的架构分层[转]
  9. weekend110(Hadoop)的 第一天笔记
  10. BS开发平台,一小时搞定功能强大的统计分析页面
  11. 关于char/varchar(n)中n的探究:字符数or字节数
  12. window下如何搭建linux环境
  13. spring security:ajax请求的session超时处理
  14. jsp页面中从forEach里向action里面传递其中的一个对象
  15. [转载]SSH框架搭建详细图文教程
  16. docker(一) Centos7下安装docker
  17. 新ubuntu系统装软件
  18. Python学习第六篇——字典中的键和值
  19. 设计模式之命令模式(Command )
  20. linux 开始

热门文章

  1. 【LOJ】#3036. 「JOISC 2019 Day3」指定城市
  2. 剑指offer3:从尾到头打印链表每个节点的值
  3. 购物车以php原生cookie实现
  4. 屹今为止最好用的HTTP客户端命令行工具-接口调试神器HTTPie
  5. 学习实践:使用模式,原则实现一个C++数据库访问类
  6. Web前端开发JavaScript基础
  7. Java Web 拦截器和过滤器的区别
  8. vue 换肤
  9. C#委托的定义 以及使用方式详解,更简单的理解委托。
  10. div布局(持续更新)