传送门


给树竟直接给父子关系!!!真良心

首先一个贪心策略:每一次选择的链一定是所有链中权值最大的。这应该比较显然

那么我们接下来考虑如何维护这个贪心。我们可以使用长链剖分进行维护,对权值进行长链剖分,然后取前$K$大的链权值和,就是答案了。

考虑这个贪心为什么是对的。假设我们选到了第$i$条链,意味着第$i$条链的链顶的所有祖先都一定已经被访问过了(否则它一定是其父亲的儿子中链最长的点,它就不会是链顶),所以选择这一条链的意义就是选择从根到这一条链的链底的路径。

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. //This code is written by Itst
  4. using namespace std;
  5.  
  6. inline int read(){
  7. ;
  8. ;
  9. char c = getchar();
  10. while(c != EOF && !isdigit(c)){
  11. if(c == '-')
  12. f = ;
  13. c = getchar();
  14. }
  15. while(c != EOF && isdigit(c)){
  16. a = (a << ) + (a << ) + (c ^ ');
  17. c = getchar();
  18. }
  19. return f ? -a : a;
  20. }
  21.  
  22. ;
  23. struct Edge{
  24. int end , upEd;
  25. }Ed[MAXN << ];
  26. int head[MAXN] , len[MAXN] , maxLen[MAXN] , son[MAXN] , ans[MAXN] , val[MAXN] , N , K , cnt , cntEd;
  27.  
  28. inline void addEd(int a , int b){
  29. Ed[++cntEd].end = b;
  30. Ed[cntEd].upEd = head[a];
  31. head[a] = cntEd;
  32. }
  33.  
  34. void dfs1(int x , int p){
  35. maxLen[x] = len[x] = val[x] + len[p];
  36. for(int i = head[x] ; i ; i = Ed[i].upEd){
  37. dfs1(Ed[i].end , x);
  38. if(maxLen[Ed[i].end] > maxLen[x]){
  39. maxLen[x] = maxLen[Ed[i].end];
  40. son[x] = Ed[i].end;
  41. }
  42. }
  43. }
  44.  
  45. void dfs2(int x , int t){
  46. if(t == x)
  47. ans[++cnt] = maxLen[x] - len[x] + val[x];
  48. for(int i = head[x] ; i ; i = Ed[i].upEd)
  49. dfs2(Ed[i].end , Ed[i].end == son[x] ? t : Ed[i].end);
  50. }
  51.  
  52. bool cmp(int a , int b){
  53. return a > b;
  54. }
  55.  
  56. signed main(){
  57. #ifndef ONLINE_JUDGE
  58. freopen("3252.in" , "r" , stdin);
  59. //freopen("3252.out" , "w" , stdout);
  60. #endif
  61. N = read();
  62. K = read();
  63. ; i <= N ; ++i)
  64. val[i] = read();
  65. ; i < N ; ++i){
  66. int a = read() , b = read();
  67. addEd(a , b);
  68. }
  69. dfs1( , );
  70. dfs2( , );
  71. sort(ans + , ans + cnt + , cmp);
  72. ;
  73. ; i <= K ; ++i)
  74. sum += ans[i];
  75. cout << sum;
  76. ;
  77. }

BZOJ3252 攻略 贪心、长链剖分的更多相关文章

  1. 219.01.19 bzoj3252: 攻略(长链剖分+贪心)

    传送门 长链剖分好题. 题意:给一棵带点权的树,可以从根节点到任一叶节点走kkk次,走过的点只能计算一次,问kkk次走过的点点权值和最大值. 思路: 考虑将整棵树带权长链剖分,这样链与链之间是不会重复 ...

  2. BZOJ.3252.攻略(贪心 长链剖分/线段树)

    题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...

  3. 【BZOJ3252】攻略(长链剖分,贪心)

    [BZOJ3252]攻略(长链剖分,贪心) 题面 BZOJ 给定一棵树,每个点有点权,选定\(k\)个叶子,满足根到\(k\)个叶子的所有路径所覆盖的点权和最大. 题解 一个假装是对的贪心: 每次选择 ...

  4. BZOJ[3252]攻略(长链剖分)

    BZOJ[3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX半岛> ...

  5. 7.28 NOI模拟赛 H2O 笛卡尔树 并查集 贪心 长链剖分

    LINK:H2O 这场比赛打的稀烂 爆蛋. 只会暴力.感觉暴力细节比较多不想写. 其实这道题的难点就在于 采取什么样的策略放海绵猫. 知道了这一点才能确定每次放完海绵猫后的答案. 暴力枚举是不行的.而 ...

  6. bzoj3252: 攻略(贪心)

    /* 因为权值都是正的, 所以贪心的正确性能保证 然后重链贪心跑一下就好了 */ #include<cstdio> #include<algorithm> #include&l ...

  7. bzoj3252 攻略 贪心+dfs序+线段树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3252 题解 有一个非常显然的贪心思路:每次选择目前走到那儿能够获得的新权值最大的点. 证明的话 ...

  8. BZOJ3252攻略——长链剖分+贪心

    题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...

  9. bzoj 3252: 攻略 -- 长链剖分+贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Description 题目简述:树版[k取方格数]   众所周知,桂木桂马是攻略之神,开启攻略之神 ...

随机推荐

  1. 【读书笔记】iOS-优化iOS Web应用

    一,代码优化: 代码优化是任何优化技术的第一步,因为归根结底网页上的一切都是构建在代码之上的.优秀的代码可以节省宽带,减少渲染延迟,以及提高页面的可读性和长远的可维护性.下面列出了一些在Web应用中编 ...

  2. Elasticsearch5.4署遇到的问题

    问题一 can not run elasticsearch as root Elastic 不建议通过root用户启动ES服务器,如果非要用root启动,可以在config/jvm.options配置 ...

  3. 洗礼灵魂,修炼python(17)--跨平台操作三剑客—os,os.path.sys模块

    os 1.作用: 因为客户基本都是使用不同的操作系统,在不同的系统下,要完成一个项目,那必须跨平台操作,而python本来就是一个跨平台的语言,而有了os模块,则不需要在意什么系统.并且os模块是用于 ...

  4. ARM有几条memory barrier 的指令?分别有什么区别?

    从ARMv7指令集开始,ARM提供3条内存屏障指令. (1)数据存储屏障( Data Memory Barrier,DMB) 数据存储器隔离.DMB指令保证:仅当所有在它前面的存储器访问操作都执行完毕 ...

  5. Nginx状态信息(status)配置及信息详解

    nginx状态信息功能的介: Nginx 在编译安装 Nginx 的时候添加 --with-http_stub_status_module 参数,其功能是记录 Nginx 的基本访问状态信息,让使用者 ...

  6. php二维数组去重

    php二维数组去重 前言:php一维数组去重很简单,直接array_unique($arr)即可,但是二维数组去重就得自己去写了 二维数组去重方法: /* * 二维数组去重 * 注意:二维数组中的元素 ...

  7. eclipse中的tomcat配置

    打开Eclipse,单击“window”菜单,选择下方的“Preferences”:   找到Server下方的Runtime Environment,单击右方的Add按钮:   选择已经成功安装的T ...

  8. php开发中遇到的一些问题

    php警告提示A session had already been started – ignoring session_start() 解决方案 判断 如果session_id 不存在,说明没有储存 ...

  9. Django框架的使用教程--类视图-中间间-模板[六]

    类视图 类视图的使用 视图函数 class class_view(View): """类视图""" def get(self, reques ...

  10. godaddy.com 都转到 www.dnspod.cn

    我们在godaddy上注册了域名,但因为godaddy对域名解析的诸多限制和缓慢. 所以必需把域名服务器更改为dnspod上,然后再在dnspod上做A记录,CNAME等设置都很方便.