题面

从零开始的DP学习系列之叁

树形DP的基本(常见?)思路:先递归进儿子,然后边回溯边决策,设状态时常设$dp[x]$表示以$x$为根的子树中(具体分析算不算$x$这个点)的情况

显然的二分答案,之后问题转化为用$m$个能覆盖$mid$范围的点能否覆盖所有的特殊点,用树形DP判断

设$unc[nde]$表示以$nde$为根(包含$nde$)的子树中最远的未被覆盖的特殊点的距离,$cov[nde]$以$nde$为根(包含$nde$)的子树中最近的选出的点的距离。有两个从儿子$goal[i]$获取信息的显然的转移

  1. unc[nde]=max(unc[nde],unc[goal[i]]+);
  2. cov[nde]=min(cov[nde],cov[goal[i]]+);

然后考虑对点的选择,首先如果这个点是特殊点,而且$cov[nde]>mid$,说明这个点无法被子树中的点覆盖,只能交给父亲处理,于是更新一下它的$unc$的信息,告诉它的父亲考虑这个点

  1. if(imp[nde]&&cov[nde]>mid) unc[nde]=max(unc[nde],);

接下来考虑这个点的子树中的特殊点(们)能否靠这个点解决,如果$unc[nde]+cov[nde]<=mid$说明这个子树不需要父亲管了

  1. if(unc[nde]+cov[nde]<=mid) unc[nde]=-inf;

最后是考虑是否选择这个点,这里贪心考虑,只在$unc$正好等于$mid$时选择这个点

  1. if(unc[nde]==mid) unc[nde]=-inf,cov[nde]=,tot++;

注意的是根节点没有父亲,要特殊考虑

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=,inf=0x3f3f3f3f;
  6. int p[N],noww[*N],goal[*N];
  7. int imp[N],unc[N],cov[N];
  8. int n,m,t1,t2,cnt,tot,l,r,mid,ans;
  9. void link(int f,int t)
  10. {
  11. noww[++cnt]=p[f];
  12. goal[cnt]=t,p[f]=cnt;
  13. }
  14. void DFS(int nde,int fth)
  15. {
  16. unc[nde]=-inf,cov[nde]=inf;
  17. for(int i=p[nde];i;i=noww[i])
  18. if(goal[i]!=fth)
  19. {
  20. DFS(goal[i],nde);
  21. unc[nde]=max(unc[nde],unc[goal[i]]+);
  22. cov[nde]=min(cov[nde],cov[goal[i]]+);
  23. }
  24. if(imp[nde]&&cov[nde]>mid) unc[nde]=max(unc[nde],);
  25. if(unc[nde]+cov[nde]<=mid) unc[nde]=-inf;
  26. if(unc[nde]==mid) unc[nde]=-inf,cov[nde]=,tot++;
  27. }
  28. bool check(int x)
  29. {
  30. tot=; DFS(,);
  31. return tot+(unc[]>=)<=m;
  32. }
  33. int main ()
  34. {
  35. scanf("%d%d",&n,&m),r=n;
  36. for(int i=;i<=n;i++)
  37. scanf("%d",&imp[i]);
  38. for(int i=;i<n;i++)
  39. {
  40. scanf("%d%d",&t1,&t2);
  41. link(t1,t2),link(t2,t1);
  42. }
  43. while(l<=r)
  44. {
  45. mid=(l+r)/;
  46. if(check(mid)) r=mid-,ans=mid;
  47. else l=mid+;
  48. }
  49. printf("%d",ans);
  50. return ;
  51. }

解题:POI 2011 Dynamite的更多相关文章

  1. [ POI 2011 ] Dynamite

    \(\\\) \(Description\) 一棵\(N\)个节点的树,树上有\(M\)个节点是关键点,选出\(K\)个特殊点,使得所有关键点到特殊点的距离中最大的最小,输出最大值最小为多少. \(N ...

  2. 解题:POI 2011 Strongbox

    首先洛谷的题面十分的劝退(至少对我这个菜鸡来说是这样),我来解释一下(原来的英文题面): 有一个有若干个密码(每个密码都可以开箱子)的密码箱,密码是在$0$到$n-1$的数中的,且所有的密码都满足一个 ...

  3. 【BZOJ 2216】【POI 2011】Lightning Conductor

    http://www.lydsy.com/JudgeOnline/problem.php?id=2216 学习了一下决策单调性. 这道题决策单调性比较明显,不详细证了. 对于一个决策i,如果在i之前的 ...

  4. 【BZOJ 2212】【POI 2011】Tree Rotations

    http://www.lydsy.com/JudgeOnline/problem.php?id=2212 自下而上贪心. 需要用权值线段树来记录一个权值区间内的出现次数. 合并线段树时统计逆序对的信息 ...

  5. bzoj 2276 [ Poi 2011 ] Temperature —— 单调队列

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2276 维护 l 递减的单调队列,队头的 l > 当前的 r 就出队,因为不能是连续一段 ...

  6. [ POI 2011 ] Party

    \(\\\) \(Description\) 给定一张 \(N\ (\ N\equiv 0\pmod{3}\ )\) 个节点,,\(M\)条边的图,并且保证该图存在一个大小至少为\(\frac{2}{ ...

  7. 洛谷 P3515 [ POI 2011 ] Lightning Conductor —— 决策单调性DP

    题目:https://www.luogu.org/problemnew/show/P3515 决策单调性... 参考TJ:https://www.cnblogs.com/CQzhangyu/p/725 ...

  8. Solution -「POI 2011」「洛谷 P3527」MET-Meteors

    \(\mathcal{Description}\)   Link.   给定一个大小为 \(n\) 的环,每个结点有一个所属国家.\(k\) 次事件,每次对 \([l,r]\) 区间上的每个点点权加上 ...

  9. POI题解整合

    我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...

随机推荐

  1. rename命令详解

    基础命令学习目录首页 原文链接:http://man.linuxde.net/rename 将main1.c重命名为main.c rename main1.c main.c main1.c renam ...

  2. Windows搭建python开发环境

    python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 基本概念Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum ...

  3. 基于LiFi可见光通信技术的研究及应用转化调查

    这个仅是本人的部分调研结果,有同行做可见光研究的可以联系交流,QQ:391349683 

  4. 请教JDBC中的thin和OCI的区别\

    请教JDBC中的thin和OCI的区别 https://zhidao.baidu.com/question/2267123737573204748.html

  5. OO第四次作业-对前三次作业总结

    第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...

  6. Linux基础入门--04

    目录结构及文件基本操作 实验介绍: 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录结构之 ...

  7. C#中周,月,第几周,周开始结束时间de方法总结

    1.c#获取当前时间是本年的第几周,本月的第几周 private static int getWeekNumInMonth(DateTime daytime) { int dayInMonth = d ...

  8. 编程之法section II: 2.1 求最小的k个数

    ====数组篇==== 2.1 求最小的k个数: 题目描述:有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 解法一: 思路:快排后输出前k个元素,O(nlogn). writer: zz ...

  9. Alpha 冲刺报告(4/10)

    Alpha 冲刺报告(4/10) 队名:洛基小队 峻雄(组长) 已完成:继续行动脚本的编写 明日计划:尽量完成角色的移动 剩余任务:物品背包交互代码 困难:具体编码进展比较缓慢 ----------- ...

  10. 对WEB url 发送POST请求

    package com.excellence.spark; import java.util.List; import com.excellence.spark.test.test; import c ...