【BZOJ2525】[Poi2011]Dynamite

Description

Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有的炸.药。
  1. 某个点上的引线被点燃后的1单位时间内,在树上和它相邻的点的引线会被点燃。如果一个有炸.药的点的引信被点燃,那么这个点上的炸.药会爆炸。
  2. 求引爆所有炸.药的最短时间。
  3. 输入:
  4. 第一行是两个整数N,M。(1<=m<=n<=300000
  5. 接下来一行有N个整数Di,第I个数为1表示该点有炸.药。
  6. 接下来N-1行每行有两个数A,B,表示AB之间有一条边。
  7. 输出:
  8. 最短时间。
  9. 样例解释: 
  10. 点燃3,5上的引线。

Sample Input

7 2
1 0 1 1 0 1 1
1 3
2 3
3 4
4 5
5 6
5 7

Sample Output

1
 
  1. /*
  2. 二分答案。
  3. 然后接下来从下往上扫整棵树。
  4. 节点的状态有:
  5. 第一种 子树内没有不被覆盖的关键点,并且子树中有一个节点的贡献可以继续往上。
  6. 第二种 子树内有不被覆盖的关键点,子树中没有节点的贡献可以继续往上。
  7. 第三种 既没有 不被覆盖的关键点,又没有 可以继续往上贡献的点。
  8. 第四种 都有。
  9. 但是 可以证明,第四种情况存在的话,显然可以在子树外挑一个点来覆盖没有被覆盖的关键点,但是这个时候子树内的挑选的点就没有卵用了,所以这种情况可以归到第三种。
  10. 然后具体就是贪心讨论的过程了。
  11. 贪心的思想就是,能不染就不染
  12. 显然第一种需要记录还能往上走多少。
  13. 第二种需要记录最远的不被覆盖的关键点到达目前的根节点的距离
  14. */
  15.  
  16. #include<iostream>
  17. #include<cstdio>
  18.  
  19. #define N 300007
  20.  
  21. using namespace std;
  22. int n,m,h[N],cnt,d[N],sum,sm,mx[N],mn[N];
  23. struct edge
  24. {
  25. int ne,to;
  26. }e[N<<];
  27.  
  28. inline int read()
  29. {
  30. int x=,f=;char c=getchar();
  31. while(c>''||c<''){if(c=='-')f=-;c=getchar();}
  32. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  33. return x*f;
  34. }
  35.  
  36. void add(int u,int v)
  37. {
  38. e[++cnt].to=v;e[cnt].ne=h[u];h[u]=cnt;
  39. }
  40.  
  41. void dfs(int u,int fa,int w)
  42. {
  43. mx[u]=-1e9,mn[u]=1e9;
  44. for(int i=h[u];i;i=e[i].ne)
  45. if(e[i].to!=fa)
  46. {
  47. dfs(e[i].to,u,w);
  48. mx[u]=max(mx[u],mx[e[i].to]+);
  49. mn[u]=min(mn[u],mn[e[i].to]+);
  50. }
  51. if(d[u]&&mn[u]>w) mx[u]=max(mx[u],);
  52. if(mx[u]+mn[u]<=w)mx[u]=-1e9;
  53. if(mx[u]==w) sm++,mx[u]=-1e9,mn[u]=;
  54. }
  55.  
  56. bool ok(int w)
  57. {
  58. sm=;dfs(,,w);
  59. return sm+(mx[]>=)<=m;
  60. }
  61.  
  62. int main()
  63. {
  64. n=read(),m=read();
  65. for(int i=;i<=n;i++)
  66. d[i]=read(),sum+=d[i];
  67. for(int i=;i<n;i++)
  68. {
  69. int x=read(),y=read();
  70. add(x,y),add(y,x);
  71. }
  72. if(sum<=m)
  73. {
  74. puts("");return ;
  75. }
  76. int l=,r=n,ans=n;
  77. while(l<=r)
  78. {
  79. int mid=(l+r)>>;
  80. if(ok(mid)) r=mid-,ans=mid;
  81. else l=mid+;
  82. }
  83. printf("%d\n",ans);
  84. return ;
  85. }

【BZOJ2525】[Poi2011]Dynamite(二分,树形dp)的更多相关文章

  1. 【BZOJ2525】[Poi2011]Dynamite 二分+树形DP

    [BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...

  2. bzoj 2525 [Poi2011]Dynamite 二分+树形dp

    [Poi2011]Dynamite Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 270  Solved: 138[Submit][Status][D ...

  3. 【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp

    题目描述 给你一棵以1为根的有根树,初始除了1号点为黑色外其余点均为白色.Bob初始在1号点.每次Alice将其中至多k个点染黑,然后Bob移动到任意一个相邻节点,重复这个过程.求最小的k,使得无论B ...

  4. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information DisturbingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java ...

  5. HDU 3586 Information Disturbing(二分+树形dp)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...

  6. HDU 5682 zxa and leaf 二分 树形dp

    zxa and leaf 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5682 Description zxa have an unrooted t ...

  7. Codeforces 627D Preorder Test(二分+树形DP)

    题意:给出一棵无根树,每个节点有一个权值,现在要让dfs序的前k个结点的最小值最大,求出这个值. 考虑二分答案,把>=答案的点标记为1,<答案的点标记为0,现在的任务时使得dfs序的前k个 ...

  8. bzoj 2067: [Poi2004]SZN【贪心+二分+树形dp】

    第一问就是Σ(deg[u]-1)/2+1 第二问是二分,判断的时候考虑第一问的贪心规则,对于奇度数的点,两两配对之后一条延伸到上面:对于欧度数的点,两两配对或者deg[u]-2的点配对,然后一条断在这 ...

  9. BZOJ2525 [Poi2011]Dynamite 【二分 + 贪心】

    题目链接 BZOJ2525 题解 就是要求所有有炸弹的点到点燃点距离最大值最小 显然二分答案距离\(D\) 然后按深度排序,贪心点燃当前没覆盖的深度最深的点往上第\(D\)层的点 每覆盖一个点要标记其 ...

随机推荐

  1. Android BGABadgeView:新消息/未接来电/未读消息/新通知圆球红点提示(1)

     Android BGABadgeView:新消息/未接来电/未读消息/新通知圆球红点提示(1) 现在很多的APP会有新消息/未接来电/未读消息/新通知圆球红点提示,典型的以微信.QQ新消息提示为 ...

  2. ORACLE ASH/AWR

    (一) ASH 用户在ORACLE数据库中执行操作时,必然要创建相应的连接和会话,其中,所有当前的会话信息都保存在动态性能视图V$SESSION中,通过该视图,DBA可以查看用户实际执行的操作,或者当 ...

  3. SQL SERVER 2012 第三章 T-SQL 基本语句 group by 聚合函数

    select Name,salesPersonID From Sales.store where name between 'g' and 'j' and salespersonID > 283 ...

  4. cogs——1215. [Tyvj Aug11] 冗余电网

    1215. [Tyvj Aug11] 冗余电网 ★   输入文件:ugrid.in   输出文件:ugrid.out   简单对比 时间限制:1 s   内存限制:128 MB TYVJ八月月赛提高组 ...

  5. html5视频播放器 一 (改写默认样式)

    一个项目用到了html5视频播放器,于是就写了一个,走了很多坑,例如在chrome中加载视频出现加载异常等 先看看效果 是不是感觉换不错,以下是我播放器改写样式的布局. <!DOCTYPE ht ...

  6. MongoDB小结20 - find【查询条件$size】

    size可以获得指定数组长度的文档 db.user.find({"fruit":{"$size":3}},{"_id":0}) { &quo ...

  7. 实战!利用MSF批量扫描校园网中含有MS17_010漏洞的主机并入侵

    利用ms17_010的永恒之蓝在前些日子火爆了一段时间,校园网中也声称封锁了相应端口.最近在搞MSF的深入学习,于是有了下文. ms17_010扫描工具 msf中的辅助模块含有一个强大的ms17_01 ...

  8. 用vhd挂载并安装win7且建立分差vhd

    准备:硬盘分区激活第一个分区; imagex.exe; install.wim; winpe boot pc 1.cmd命令下,创建主vhd      (1)diskpart       (打开dis ...

  9. 看opengl写代码(7) 使用混合数组(glInterLeavedArrays)

    glInterLeavedArrays 函数  有 三个 參数 : mode ,stride,pointer. mode :指示 开启 哪些 顶点数组,以及 顶点数组 使用的 数据类型. 其余的 顶点 ...

  10. android 特殊符号开头的联系人归并至“#”下

    在PeopleActivity界面.联系人的显示位置是由其display name的第一个字符决定的. 数字开头的联系人会显示在"#"这个header下. 中英文联系人会显示在&q ...