博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5242 利用树链剖分思想进行贪心
阅读量:5155 次
发布时间:2019-06-13

本文共 1938 字,大约阅读时间需要 6 分钟。

 题目大意:

在给定带权值节点的树上从1开始不回头走到某个底端点后得到所有经过的点的权值后,这些点权值修改为0,到达底部后重新回到1,继续走,问走k次,最多能得到多少权值之和

 

这其实就是相当于每一次都走权值最大的那一条路径,进行贪心k次

首先先来想想树链剖分的时候的思想:

重儿子表示这个儿子对应的子树的节点数最多,那么每次访问都优先访问重儿子

这道题里面我们进行一下转化,如果当前儿子能走出一条最长的路径,我们就令其为重儿子,那么很容易想到,到达父亲时,如果选择重儿子,那么之前到达

父亲所得的权值一定是记录在重儿子这条路径上的,那么访问轻儿子的时候,因为前面的值在到达重儿子后修改为0,所以走到轻儿子之前权值和修改为0

 

我们将所有到达底端点的路径长度保存到rec数组中,将rec排序取前k个即可,如果不够取,相当于全部取完,因为后面再走也就是相当于0,不必计算

1 #include 
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 #define N 100100 8 #define ll long long 9 10 int first[N] , k , t;11 //t记录底层节点的个数,rec[i]记录到达i节点的那个时候经过的长度12 ll rec[N];13 14 struct Edge{15 int y , next;16 Edge(int y=0 , int next=0):y(y),next(next){}17 }e[N];18 19 void add_edge(int x , int y)20 {21 e[k] = Edge(y , first[x]);22 first[x] = k++;23 }24 25 bool cmp(ll a , ll b)26 {27 return a>b;28 }29 30 ll val[N] , down[N];//down[i]记录从i开始往下能走到的最长的路径31 int heavyson[N];32 void dfs(int u)33 {34 ll maxn = -1;35 for(int i=first[u] ; ~i ; i=e[i].next)36 {37 int v = e[i].y;38 dfs(v);39 if(maxn
=0) down[u] = maxn+val[u];45 else down[u] = val[u];46 }47 48 void dfs1(int u , ll cur)49 {50 bool flag = true; //判断是否为底层节点51 if(heavyson[u]){52 dfs1(heavyson[u] , cur+val[heavyson[u]]);53 flag = false;54 }55 for(int i=first[u] ; ~i ; i=e[i].next)56 {57 int v = e[i].y;58 if(v == heavyson[u]) continue;59 dfs1(v , val[v]);60 flag = false;61 }62 if(flag) rec[t++] = cur;63 }64 65 int main()66 {67 #ifndef ONLINE_JUDGE68 freopen("a.in" , "r" , stdin);69 #endif70 int T , cas=0;71 scanf("%d" , &T);72 while(T--)73 {74 printf("Case #%d: " , ++cas);75 int n,m;76 scanf("%d%d" , &n , &m);77 memset(first , -1 , sizeof(first));78 k=0;79 for(int i=1 ; i<=n ; i++) scanf("%I64d" , val+i);80 for(int i=1 ; i

 

转载于:https://www.cnblogs.com/CSU3901130321/p/4551179.html

你可能感兴趣的文章
pytorch中的forward前向传播机制
查看>>
课后作业-阅读任务-阅读提问-4
查看>>
Delphi 深入浅出VCL(2)-TObject所有对象的根
查看>>
配置IIS虚拟目录遇到的5个问题
查看>>
2-03顺序表的操作
查看>>
耿丹CS16-2班第一次作业汇总
查看>>
查看mysql表大小
查看>>
命令行程序测试自动化
查看>>
My Blog
查看>>
array_reduce() 与 array_map()
查看>>
SASS实现代码的重用:混合器Mixin、继承
查看>>
《windows核心编程系列》三谈谈内核对象及句柄的本质
查看>>
Linux下安装maven
查看>>
使用OpenMP实现并行归并排序(Report)
查看>>
转:【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量...
查看>>
linux nohup【转】
查看>>
SQL语句优化
查看>>
校验银行卡号是否符合Luhn算法及生成符合Luhn算法的银行卡号
查看>>
MFC 双缓冲加载背景
查看>>
记录自己最近的学习状态
查看>>