Description

题目简述:树版[k取方格数]
 
众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏。
今天他得到了一款新游戏《XX半岛》,这款游戏有n个场景(scene),某些场景可以通过不同的选择支到达其他场景。所有场景和选择支构成树状结构:开始游戏时在根节点(共通线),叶子节点为结局。每个场景有一个价值,现在桂马开启攻略之神模式,同时攻略k次该游戏,问他观赏到的场景的价值和最大是多少(同一场景观看多次是不能重复得到价值的)
“为什么你还没玩就知道每个场景的价值呢?”
“我已经看到结局了。”

Input

第一行两个正整数n,k
第二行n个正整数,表示每个场景的价值
以下n-1行,每行2个整数a,b,表示a场景有个选择支通向b场景(即a是b的父亲)
保证场景1为根节点

Output

 
输出一个整数表示答案

Sample Input

5 2
4 3 2 1 1
1 2
1 5
2 3
2 4

Sample Output

10

HINT

对于100%的数据,n<=200000,1<=场景价值<=2^31-1

 
很容易得到这样一个贪心策略:每次优先找一条从根开始的权值最大的路径,然后用数据结构修改其他路径的权值。
因为一个场景最多被选1次,所以每次顺着路径的末节点向上一直修改到上一个被选择的节点,这样修改的时间复杂度就是O(N)*O(数据结构)。
因为场景会影响一个子树内所有的节点,所以这里的数据结构用棵线段树就行了,时间复杂度为O(NlogN)。
  1. #include<cstdio>
  2. #include<cctype>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define ren for(int i=first[x];i;i=next[i])
  9. using namespace std;
  10. const int BufferSize=1<<16;
  11. char buffer[BufferSize],*head,*tail;
  12. inline char Getchar() {
  13. if(head==tail) {
  14. int l=fread(buffer,1,BufferSize,stdin);
  15. tail=(head=buffer)+l;
  16. }
  17. return *head++;
  18. }
  19. inline int read() {
  20. int x=0,f=1;char c=Getchar();
  21. for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
  22. for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
  23. return x*f;
  24. }
  25. typedef long long ll;
  26. const int maxn=200010;
  27. int n,k,A[maxn],first[maxn],next[maxn],to[maxn],e;
  28. void AddEdge(int v,int u) {to[++e]=v;next[e]=first[u];first[u]=e;}
  29. int st[maxn],en[maxn],pos[maxn],fa[maxn],del[maxn],cnt;
  30. ll val[maxn];
  31. void dfs(int x) {
  32. st[x]=++cnt;pos[cnt]=x;val[x]+=A[x];
  33. ren val[to[i]]=val[x],fa[to[i]]=x,dfs(to[i]);
  34. en[x]=cnt;
  35. }
  36. struct Ans {int p;ll v;}maxv[maxn<<2];
  37. Ans better(Ans A,Ans B) {
  38. if(A.v>B.v) return A;
  39. return B;
  40. }
  41. ll addv[maxn<<2];
  42. void maintain(int o,int l,int r) {
  43. int lc=o<<1,rc=lc|1;
  44. if(l<r) maxv[o]=better(maxv[lc],maxv[rc]);
  45. else maxv[o]=(Ans){l,0};
  46. if(addv[o]) maxv[o].v+=addv[o];
  47. }
  48. void build(int o,int l,int r) {
  49. if(l==r) addv[o]=val[pos[l]];
  50. else {
  51. int mid=l+r>>1,lc=o<<1,rc=lc|1;
  52. build(lc,l,mid);build(rc,mid+1,r);
  53. }
  54. maintain(o,l,r);
  55. }
  56. void update(int o,int l,int r,int ql,int qr,int v) {
  57. if(ql<=l&&r<=qr) addv[o]+=v;
  58. else {
  59. int mid=l+r>>1,lc=o<<1,rc=lc|1;
  60. if(addv[o]) addv[lc]+=addv[o],addv[rc]+=addv[o],addv[o]=0;
  61. if(ql<=mid) update(lc,l,mid,ql,qr,v);
  62. else maintain(lc,l,mid);
  63. if(qr>mid) update(rc,mid+1,r,ql,qr,v);
  64. else maintain(rc,mid+1,r);
  65. }
  66. maintain(o,l,r);
  67. }
  68. int main() {
  69. n=read();k=read();
  70. rep(i,1,n) A[i]=read();
  71. rep(i,1,n-1) AddEdge(read(),read());
  72. dfs(1);build(1,1,n);ll ans=0;
  73. while(k--) {
  74. Ans x=maxv[1];ans+=x.v;
  75. if(!x.v) break;
  76. int u=pos[x.p];
  77. while(u&&!del[u]) {
  78. del[u]=1;
  79. update(1,1,n,st[u],en[u],-A[u]);
  80. u=fa[u];
  81. }
  82. }
  83. printf("%lld\n",ans);
  84. return 0;
  85. }

  

BZOJ3252: 攻略的更多相关文章

  1. [bzoj3252]攻略_dfs序_线段树_贪心

    攻略 bzoj-3252 题目大意:给定一棵n个节点的有根树,点有点权.让你选出至多k个节点,使得他们到根的链的并最大. 注释:$1\le n\le 2\cdot 10^5$,$1\le val_i\ ...

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

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

  3. BZOJ3252 攻略 [树链剖分]

    题目传送门 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1169  Solved: 554[Submit][Status][Discuss] ...

  4. bzoj3252 攻略 dfs序+线段树

    题目传送门 题目大意:给出一棵树,1为根节点,每个节点都有权值,每个叶子节点都是一个游戏的结局,选择k个游戏结局,使得权值总和最大,同一个节点不会被重复计算. 思路:这道题最关键的是要想到一个性质,就 ...

  5. bzoj3252攻略(线段树+dfs序)

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 562  Solved: 238[Submit][Status][Discuss] D ...

  6. BZOJ3252 攻略(贪心+dfs序+线段树)

    考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...

  7. BZOJ3252: 攻略 可并堆

    网上有很多人说用dfs序+线段树做...其实stl的堆可以...可并堆可以...很多奇奇怪怪的东西都能做... 可并堆比较好想...也比较好写... 分析: 首先,这是一个网络流做不了的题...数据太 ...

  8. BZOJ3252 攻略 贪心、长链剖分

    传送门 给树竟直接给父子关系!!!真良心 首先一个贪心策略:每一次选择的链一定是所有链中权值最大的.这应该比较显然 那么我们接下来考虑如何维护这个贪心.我们可以使用长链剖分进行维护,对权值进行长链剖分 ...

  9. bzoj3252: 攻略(贪心)

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

随机推荐

  1. 数据存储_SQLite (2)

    SQL代码应用示例 一.使用代码的方式批量添加(导入)数据到数据库中 在ios项目中使用代码批量添加多行数据示例 代码示例: 1 // 2 // main.m 3 // 01-为数据库添加多行数据 4 ...

  2. 使用excel结合线性规划求解Holt-Winters参数

      其实上面这个是Holt-Winters无季节趋势模型, 上面的S(t)对应下面的a(t)——截距(平滑值)            b(t)仍然对应b(t)——趋势,T对应k.           ...

  3. Silicon C8051F340之GPIO口配置与使用

    一.背景: 很久前用过C8051,现在有相关需求需要重新使用C8051,然后发现一年前开发的相关经验都忘得 基本上差不多了.连最基本的GPIO口配置还得重新来看手册,所以有此文,做个记录,以备下次快速 ...

  4. PHP用curl伪造IP和来源

    以前没有这么搞过. 今天群里一个朋友在问这个问题. 查了下,CURL确实很强悍的可以伪造IP和来源. 1.php 请求 2.php . 1.php代码: $ch = curl_init(); curl ...

  5. Java 串口通信

    在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...

  6. CDN的特点

    CDN的特点 1.本地Cache加速提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度,并大大提高以上性质站点的稳定性(省钱,用户体验提升). 2.镜像服务消除了不同运营商之间的瓶颈造成的影响 ...

  7. iOS开发——高级篇——图片轮播及其无限循环效果

    平时APP中的广告位.或者滚动的新闻图片等用到的就是图片轮播这种效果,实现方式主要有两种,一种是ScrollView+ImageView,另一种则是通过CollectionView,今天总结的是Scr ...

  8. 分享一些前端开发中最常用的JS代码片段~ 干货~

    http://www.w3cfuns.com/notes/25068/1d0d350a974d879e63f1115cf80a3288.html

  9. JS中的 new 操作符简单理解

    首先上一一个简单的 new 操作符实例 var Person = function(name){ this.name = name; this.say = function(){ return &qu ...

  10. SpringMVC中遇到的Http400 Bad Request 总结

    在搭建SpringMVC环境,在使用中遇到了多次Bad Request的连接,下面来总结下. 1.参数类型不对,如后台实体类的属性为int,但传来的参数为字符串 2.因为我的粗心,本来是要通过Ajax ...