HDU 5242 利用树链剖分思想进行贪心
题目大意:
在给定带权值节点的树上从1开始不回头走到某个底端点后得到所有经过的点的权值后,这些点权值修改为0,到达底部后重新回到1,继续走,问走k次,最多能得到多少权值之和
这其实就是相当于每一次都走权值最大的那一条路径,进行贪心k次
首先先来想想树链剖分的时候的思想:
重儿子表示这个儿子对应的子树的节点数最多,那么每次访问都优先访问重儿子
这道题里面我们进行一下转化,如果当前儿子能走出一条最长的路径,我们就令其为重儿子,那么很容易想到,到达父亲时,如果选择重儿子,那么之前到达
父亲所得的权值一定是记录在重儿子这条路径上的,那么访问轻儿子的时候,因为前面的值在到达重儿子后修改为0,所以走到轻儿子之前权值和修改为0
我们将所有到达底端点的路径长度保存到rec数组中,将rec排序取前k个即可,如果不够取,相当于全部取完,因为后面再走也就是相当于0,不必计算
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define N 100100
#define ll long long int first[N] , k , t;
//t记录底层节点的个数,rec[i]记录到达i节点的那个时候经过的长度
ll rec[N]; struct Edge{
int y , next;
Edge(int y= , int next=):y(y),next(next){}
}e[N]; void add_edge(int x , int y)
{
e[k] = Edge(y , first[x]);
first[x] = k++;
} bool cmp(ll a , ll b)
{
return a>b;
} ll val[N] , down[N];//down[i]记录从i开始往下能走到的最长的路径
int heavyson[N];
void dfs(int u)
{
ll maxn = -;
for(int i=first[u] ; ~i ; i=e[i].next)
{
int v = e[i].y;
dfs(v);
if(maxn<down[v]){
heavyson[u] = v;
maxn = down[v];
}
}
if(maxn>=) down[u] = maxn+val[u];
else down[u] = val[u];
} void dfs1(int u , ll cur)
{
bool flag = true; //判断是否为底层节点
if(heavyson[u]){
dfs1(heavyson[u] , cur+val[heavyson[u]]);
flag = false;
}
for(int i=first[u] ; ~i ; i=e[i].next)
{
int v = e[i].y;
if(v == heavyson[u]) continue;
dfs1(v , val[v]);
flag = false;
}
if(flag) rec[t++] = cur;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in" , "r" , stdin);
#endif
int T , cas=;
scanf("%d" , &T);
while(T--)
{
printf("Case #%d: " , ++cas);
int n,m;
scanf("%d%d" , &n , &m);
memset(first , - , sizeof(first));
k=;
for(int i= ; i<=n ; i++) scanf("%I64d" , val+i);
for(int i= ; i<n ; i++){
int u,v;
scanf("%d%d" , &u , &v);
add_edge(u , v);
}
memset(heavyson , , sizeof(heavyson));
dfs();
t=;
dfs1( , val[]);
sort(rec , rec+t , cmp);
ll ret = ;
for(int i= ; i<t ; i++){
if(i==m) break;
ret+=rec[i];
}
printf("%I64d\n" , ret);
}
return ;
}
HDU 5242 利用树链剖分思想进行贪心的更多相关文章
- HDU 5242 树链剖分思想的贪心
题意及博客 树链剖分分为2步,第一次求出深度,重儿子,第二次求出重链,用到了启发式的思想,即对于比较重的儿子,尽量去完整的维护它.类似于我们去合并两个堆,明显把小的堆逐个插入大的堆中会比大的往小的插更 ...
- hdu 5458 Stability(树链剖分+并查集)
Stability Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total ...
- HDU 5044 (树链剖分+树状数组+点/边改查)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5044 题目大意:修改链上点,修改链上的边.查询所有点,查询所有边. 解题思路: 2014上海网赛的变 ...
- HDU 3966(树链剖分+点修改+点查询)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题目大意:营地的分布成树型.每个营地都有一些人,每次修改修改一条链上的所有营地的人数,每次查询单 ...
- HDU 5458 Stability (树链剖分+并查集+set)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 给你n个点,m条边,q个操作,操作1是删边,操作2是问u到v之间的割边有多少条. 这题要倒着做才 ...
- HDU 5044 Tree --树链剖分
题意:给一棵树,两种操作: ADD1: 给u-v路径上所有点加上值k, ADD2:给u-v路径上所有边加上k,初始值都为0,问最后每个点和每条边的值,输出. 解法:树链剖分可做,剖出来如果直接用线段树 ...
- HDU - 3966-Aragorn' Story(树链剖分+线段树)
链接:https://vjudge.net/problem/HDU-3966 题意: Our protagonist is the handsome human prince Aragorn come ...
- HDU 3966 RE 树链剖分 线段树 Aragorn's Story
题意: 给出一棵树,每个顶点上有一个权值. 操作:选择一条路径,并将路径上所有的点的权值同时加或减某个数. 查询:某个点的当前权值 分析: 树链剖分完毕后,就是简单的线段树区间更新. 提交的时候注意要 ...
- Tree HDU - 6547 (树链剖分,线段树)
wls 有三棵树,树上每个节点都有一个值 ai,现在有 2 种操作: 将一条链上的所有节点的值开根号向下取整: 求一条链上值的和: 链的定义是两点之间的最短路. Input 第一行两个数 n, q 分 ...
随机推荐
- Suricata的规则解读(默认和自定义)
不多说,直接上干货! 见suricata官网 https://suricata.readthedocs.io/en/latest/rules/index.html 一.Suricata的规则所放位置 ...
- 06.NopCommerce配置邮箱账户
NopCommerce如果配置让用户注册为通过邮箱注册,并且注册后激活邮箱才可登录,那么我们需要对NopCommerce的邮箱账户进行配置,用来发送邮件用.当然邮件还有很多其他用途,比如发送用户订阅的 ...
- 多线程wait和notify实现1212
package threadT; public class ThreadMain { public static void main(String args[]) { final Object obj ...
- spring mvc 通过拦截器记录请求数据和响应数据
spring mvc 能过拦截器记录请求数据记录有很多种方式,主要有以下三种: 1:过滤器 2:HandlerInterceptor拦截器 3:Aspect接口控制器 但是就我个人所知要记录返回的数据 ...
- Java 设置Word页面背景色
Word中可以针对不同文档排版设计要求来设置背景设置颜色.常见的可设置单一颜色.渐变色或加载指定图片来设置成背景.下面通过Java来设置以上3种Word页面背景色. 使用工具:Spire.Doc fo ...
- Java报表之JFreeChart
一.JFreeChart简介 JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications,servlets以及JSP等使用所设计. JFre ...
- ZooKeeper读书笔记
<ZooKeeper读书笔记> 1.Zookeeper是什么?Zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用可以基于它实现诸如数据发布/订阅.负载均衡.命名服务.分布 ...
- Android(java)学习笔记181:多媒体之图片画画板案例
1.首先我们编写布局文件activity_main.xml如下: <RelativeLayout xmlns:android="http://schemas.android.com/a ...
- js 数组过滤 filter
let res = this.list.filter(item => routeEqual(this.currentRouteObj, item) || item.name === this.$ ...
- const函数的使用
const知道吗?解释其作用. 1.const 修饰类的成员变量,表示成员常量,不能被修改. 2.const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数. 3. ...