HDU 5242 树链剖分思想的贪心
树链剖分分为2步,第一次求出深度,重儿子,第二次求出重链,用到了启发式的思想,即对于比较重的儿子,尽量去完整的维护它。类似于我们去合并两个堆,明显把小的堆逐个插入大的堆中会比大的往小的插更优,而这可以达到均摊O(logn)的效果。对于这个题,类似选重儿子, 我们每次尽量选择最长的路径,选出前m个就可以了。
代码:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 100010;
int head[maxn], Next[maxn * 2], ver[maxn * 2], tot;
LL mx_d[maxn], w[maxn], dist[maxn], d[maxn];
void add(int x, int y) {
ver[++tot] = y;
Next[tot] = head[x];
head[x] = tot;
} void dfs1(int x, int fa = 0) {
mx_d[x] = d[x];
for (int i = head[x]; i; i = Next[i]) {
int y = ver[i];
if(y != fa) {
d[y] = d[x] + w[y];
dfs1(y, x);
mx_d[x] = max(mx_d[x], mx_d[y]);
}
}
}
void dfs2(int x, int fa, LL now_dist) {
LL mx = -1, tmp = 0;
dist[x] = now_dist;
int pos = 0;
for (int i = head[x]; i; i = Next[i]) {
int y = ver[i];
if(y == fa) continue;
if(mx_d[x] == mx_d[y]) {
pos = y;
break;
}
}
if(pos != 0) {
dfs2(pos, x, dist[x] + w[pos]);
dist[x] = 0;
}
for (int i = head[x]; i; i = Next[i]) {
int y = ver[i];
if(y == fa || y == pos) continue;
dfs2(y, x, w[y]);
}
}
int main() {
int T, n, m, x, y, kase = 0;
cin >> T;
while(T--) {
memset(head, 0, sizeof(head));
tot = 0;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%lld", &w[i]);
}
d[1] = dist[1] = w[1];
for (int i = 1; i < n; i++) {
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
dfs1(1);
dfs2(1, 0, w[1]);
LL ans = 0;
sort(dist + 1, dist + n + 1);
for (int i = n; i >= n - m + 1; i--) {
ans += dist[i];
}
printf("Case #%d: ", ++kase);
printf("%lld\n", ans);
} }
HDU 5242 树链剖分思想的贪心的更多相关文章
- HDU 5242 利用树链剖分思想进行贪心
题目大意: 在给定带权值节点的树上从1开始不回头走到某个底端点后得到所有经过的点的权值后,这些点权值修改为0,到达底部后重新回到1,继续走,问走k次,最多能得到多少权值之和 这其实就是相当于每一次都走 ...
- hdu 5893 (树链剖分+合并)
List wants to travel Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
- hdu 5052 树链剖分
Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- hdu 4897 树链剖分(重轻链)
Little Devil I Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- hdu 5274 树链剖分
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- Game HDU - 5242 树链思想
GameHDU - 5242 题目大意:一个游戏有n个场景形成了棵有根树,根节点是1,每个场景都有它的权值.然后一个人可以选择其中K个分支来走,而每个场景的权重只算一遍,问最大的权值和. 一开始想叉了 ...
- HDU 3966 (树链剖分+线段树)
Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...
- hdu 3966(树链剖分+线段树区间更新)
传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...
- HDU 3966 /// 树链剖分+树状数组
题意: http://acm.hdu.edu.cn/showproblem.php?pid=3966 给一棵树,并给定各个点权的值,然后有3种操作: I x y z : 把x到y的路径上的所有点权值加 ...
随机推荐
- 一道问题引出的python中可变数据类型与不可变数据类型
一. 问题的提出 我们先来看两个对比 第一道题,当对象为整数时,最终结果:b = 2, a = 1,b的变化没有引起a的变化 a = 1 b = a b += 1 print(a) print(b) ...
- npm package管理
每个项目都包含一个package.json文件用来管理项目依赖的包以及项目相关信息. 其中比较总要的就是dependencies和devDependencies两项,分别指定了项目运行所依赖的模块.项 ...
- C#中的线程(一)入门
C#中的线程(一)入门 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: ...
- Mybatis_总结_03_用_动态SQL
一.前言 MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...
- ElasticSearch_学习_01_单实例安装与分布式安装
一.前言 二.下载 1.下载地址 https://www.elastic.co/downloads/past-releases 三.单实例安装 直接解压,window下运行 elasticsearch ...
- kylin_异常_01_java.io.FileNotFoundException: /developer/apache-kylin-2.3.0-bin/tomcat/conf/.keystore
一.异常现象 kylin安装完,启动后,控制正常,kylin后台也能正常访问.但是去看kylin的日志,却发现报错了: SEVERE: Failed to load keystore type JKS ...
- L123
My heart, the bird of the wilderness, has found its sky in your eyes. 我的心是旷野的鸟,在你的双眼中找到了天空.His main ...
- CCControlSwitch 、CCControlSlider、CCControlButton
/* *bool hasMoved(); 这里获取的不是开关是否正在被用户拨动,而是开关最终的状态是由用户手动拨动开关进行的, *还是用户点击开关进行的状态更改 */ CCControlSwitch* ...
- Agc019_C Fountain Walk
传送门 题目大意 给定网格图上起点和终点每个格子是长为$100$米的正方形,你可以沿着线走. 平面上还有若干个关键点,以每个关键点为圆心,$10$为半径画圆,表示不能进入圆内的线,但是可以从圆周上走, ...
- 数据清洗记录,pandas
pandas数据清洗:http://www.it165.net/pro/html/201405/14269.html data=pd.Series([1,2,3,4]) data.replace([1 ...