GameHDU - 5242

  题目大意:一个游戏有n个场景形成了棵有根树,根节点是1,每个场景都有它的权值。然后一个人可以选择其中K个分支来走,而每个场景的权重只算一遍,问最大的权值和。

  一开始想叉了,觉得是树形dp加背包,然后好麻烦就不懂写了,但其实根本没有那么难。就是用到了个树链的思想,把整棵树分成一条条链,这样就没有了重复部分,然后就是从中取k条权值和最大的链。

  具体操作类似于树链剖分的分链处理(想起来树链剖分拖了很久没更,这两天更上)。如果不知道重链和重儿子是什么,可以先去学一下。在原来的定义里,重儿子是儿子节点中子树节点个数最多的节点,而我们这题就定义为儿子节点中拥有链权值和最大的那个节点。比如在样例1中

  

  2的重儿子就是3,而1的重儿子是2,这样就有1到3一条重链,加上4到4,5到5,3条链。然后我们把不是链顶部的节点权值清空(在上图中就是2和3),最后把所有节点权值,挑选k个最大的。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 typedef long long ll;
 5 const int N=101108;
 6 struct Side{
 7     int v,ne;
 8 }S[N];
 9 ll val[N];
10 int sn,head[N],son[N];
11 void init(int n)
12 {
13     sn=0;
14     for(int i=0;i<=n;i++)
15     {
16         head[i]=-1;
17         son[i]=0;
18     }
19 }
20 void add(int u,int v)
21 {
22     S[sn].v=v;
23     S[sn].ne=head[u];
24     head[u]=sn++;
25 }
26 void dfs1(int u)
27 {
28     for(int i=head[u];i!=-1;i=S[i].ne)
29     {
30         int v=S[i].v;
31         dfs1(v);//题目是单向边,不用在判断v是不是u的父亲
32         if(val[v]>val[son[u]])
33             son[u]=v;
34     }
35     val[u]+=val[son[u]];//把它重儿子的权值算到它这里
36 }
37 void dfs2(int u,int tf)
38 {
39     if(u!=tf)
40         val[u]=0;//不是链的顶端,权值清空
41     if(!son[u])
42         return ;
43     dfs2(son[u],tf);
44     for(int i=head[u];i!=-1;i=S[i].ne)
45     {
46         int v=S[i].v;
47         if(v!=son[u])
48             dfs2(v,v);
49     }
50 }
51 int main()
52 {
53     int t=1,T,n,k,u,v;
54     scanf("%d",&T);
55     while(t<=T)
56     {
57         scanf("%d%d",&n,&k);
58         init(n);
59         for(int i=1;i<=n;i++)
60             scanf("%lld",&val[i]);
61         for(int i=0;i<n-1;i++)
62         {
63             scanf("%d%d",&u,&v);
64             add(u,v);
65         }
66         dfs1(1);
67         dfs2(1,1);
68         sort(val+1,val+1+n);
69         ll ans=0;
70         for(int i=n;i>=1&&k;i--,k--)
71         {
72             if(!val[i])
73                 break;
74             ans+=val[i];
75         }
76         printf("Case #%d: %lld\n",t++,ans);
77     }
78     return 0;
79 }

多理解多想想

转载于:https://www.cnblogs.com/LMCC1108/p/10761729.html

Game HDU - 5242 树链思想相关推荐

  1. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  2. hdu 3966( 树链剖分+点权更新)

    题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C ...

  3. hdu 5274(树链剖分)

    解题思路:这道题据说是树链剖分,所以也学习了一下. http://blog.sina.com.cn/s/blog_7a1746820100wp67.html 不同的是这里是点权值,我按照相似的处理方式 ...

  4. HDU 3966 树链剖分后线段树维护

    题意: 一棵树, 操作1.$path(a,b)$之间的点权$+k$ 操作2.单点查询 题解: 树链剖分即可,注意代码细节,双向映射 主要是记录一下板子 #include <string.h> ...

  5. HDU 5405 (树链剖分+线段树)

    Problem Sometimes Naive 题目大意 给你一棵n个节点的树,有点权. 要求支持两种操作: 操作1:更改某个节点的权值. 操作2:给定u,v, 求 Σw[i][j]   i , j ...

  6. hdu 5052 树链剖分+线段树+区间合并

    各种裸,但合在一起好恶心... 因为路径是有向的,所以要维护区间里向两个方向走的最大收益和区间里的最大最小值,要用到区间合并的线段树 #include <iostream> #includ ...

  7. HDU 3966 POJ 3237 HYSBZ 2243 HRBUST 2064 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  8. HDU 5274 Dylans loves tree(树链剖分)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5274 [题目大意] 给出一棵树,每个点有一个权值,权值可修改,且大于等于0,询问链上出现次数为奇数 ...

  9. HDU - 3966 Aragorn's Story(树链剖分)

    题目传送门:HDU - 3966 Aragorn's Story 题目大意: 存在一个树,树上每个节点为一个阵营,阵营中存在敌人,现在要进行以下操作 I  C1  C2  K :将阵营C1到阵营C2路 ...

最新文章

  1. 免费学习编程的10个好工具
  2. 一、cocos2dx概念简介
  3. MaxCompute与OSS非结构化数据读写互通(及图像处理实例)
  4. 2008中的membership profile操作(转)
  5. CNN for Visual Recognition (assignment1_Q1)
  6. jquery 的队列queue
  7. python的dropna 和notna的性能_python数据分析学习(7)数据清洗与准备(1)
  8. 机器学习中的数学——距离定义(二十一):JS散度(Jensen–Shannon Divergence)
  9. tracepro中文pojie版-tracepro附安装教程
  10. linux usb有线网卡驱动_Linux系统下安装USB无线网卡驱动方法
  11. AcrelEMS-IDC数据中心综合能效管理解决方案
  12. 恶梦----------需求分析的漫延
  13. 我本一心向明月,奈何明月照沟渠。真是知我者谓我心忧,不知我者谓我何求啊。
  14. [026] 深度学习--学习笔记(4)Back-propagation反向传播链式法则理论推导
  15. 机械臂抓取学习笔记二
  16. python 画图 平滑曲线_用Python平滑曲线
  17. opencv python教程简书_OpenCV-Python教程:57.图像修复
  18. Python多分类问题pr曲线绘制(含代码)
  19. 标志设计中选择合适的字体
  20. 深入理解计算机系统 练习题3.8 理解计算机二元操作

热门文章

  1. Oracle触发器2-DML触发器
  2. ftp ---- 本地用户登录(实例配置1:)
  3. vue ---- vue简介
  4. 赣南师范大学科技学院计算机科学与技术,2021江西独立学院转设最新消息(新增两所):赣南师范大学科技学院转设公办?...
  5. MySQL 引擎 阿里_MySQL引擎讲解-阿里云开发者社区
  6. 得天独厚的生态优势_云南农业得天独厚的三大优势
  7. 学前教育与计算机,计算机与幼儿教育
  8. linux脚本 let,通过shell 脚本查看服务器的时时流量
  9. CSS实现间隔线样式
  10. HTML把表格链接进下拉菜单,excel表格下拉菜单怎么做