解题:POI 2011 Dynamite
从零开始的DP学习系列之叁
树形DP的基本(常见?)思路:先递归进儿子,然后边回溯边决策,设状态时常设$dp[x]$表示以$x$为根的子树中(具体分析算不算$x$这个点)的情况
显然的二分答案,之后问题转化为用$m$个能覆盖$mid$范围的点能否覆盖所有的特殊点,用树形DP判断
设$unc[nde]$表示以$nde$为根(包含$nde$)的子树中最远的未被覆盖的特殊点的距离,$cov[nde]$以$nde$为根(包含$nde$)的子树中最近的选出的点的距离。有两个从儿子$goal[i]$获取信息的显然的转移
- unc[nde]=max(unc[nde],unc[goal[i]]+);
- cov[nde]=min(cov[nde],cov[goal[i]]+);
然后考虑对点的选择,首先如果这个点是特殊点,而且$cov[nde]>mid$,说明这个点无法被子树中的点覆盖,只能交给父亲处理,于是更新一下它的$unc$的信息,告诉它的父亲考虑这个点
- if(imp[nde]&&cov[nde]>mid) unc[nde]=max(unc[nde],);
接下来考虑这个点的子树中的特殊点(们)能否靠这个点解决,如果$unc[nde]+cov[nde]<=mid$说明这个子树不需要父亲管了
- if(unc[nde]+cov[nde]<=mid) unc[nde]=-inf;
最后是考虑是否选择这个点,这里贪心考虑,只在$unc$正好等于$mid$时选择这个点
- if(unc[nde]==mid) unc[nde]=-inf,cov[nde]=,tot++;
注意的是根节点没有父亲,要特殊考虑
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int N=,inf=0x3f3f3f3f;
- int p[N],noww[*N],goal[*N];
- int imp[N],unc[N],cov[N];
- int n,m,t1,t2,cnt,tot,l,r,mid,ans;
- void link(int f,int t)
- {
- noww[++cnt]=p[f];
- goal[cnt]=t,p[f]=cnt;
- }
- void DFS(int nde,int fth)
- {
- unc[nde]=-inf,cov[nde]=inf;
- for(int i=p[nde];i;i=noww[i])
- if(goal[i]!=fth)
- {
- DFS(goal[i],nde);
- unc[nde]=max(unc[nde],unc[goal[i]]+);
- cov[nde]=min(cov[nde],cov[goal[i]]+);
- }
- if(imp[nde]&&cov[nde]>mid) unc[nde]=max(unc[nde],);
- if(unc[nde]+cov[nde]<=mid) unc[nde]=-inf;
- if(unc[nde]==mid) unc[nde]=-inf,cov[nde]=,tot++;
- }
- bool check(int x)
- {
- tot=; DFS(,);
- return tot+(unc[]>=)<=m;
- }
- int main ()
- {
- scanf("%d%d",&n,&m),r=n;
- for(int i=;i<=n;i++)
- scanf("%d",&imp[i]);
- for(int i=;i<n;i++)
- {
- scanf("%d%d",&t1,&t2);
- link(t1,t2),link(t2,t1);
- }
- while(l<=r)
- {
- mid=(l+r)/;
- if(check(mid)) r=mid-,ans=mid;
- else l=mid+;
- }
- printf("%d",ans);
- return ;
- }
解题:POI 2011 Dynamite的更多相关文章
- [ POI 2011 ] Dynamite
\(\\\) \(Description\) 一棵\(N\)个节点的树,树上有\(M\)个节点是关键点,选出\(K\)个特殊点,使得所有关键点到特殊点的距离中最大的最小,输出最大值最小为多少. \(N ...
- 解题:POI 2011 Strongbox
首先洛谷的题面十分的劝退(至少对我这个菜鸡来说是这样),我来解释一下(原来的英文题面): 有一个有若干个密码(每个密码都可以开箱子)的密码箱,密码是在$0$到$n-1$的数中的,且所有的密码都满足一个 ...
- 【BZOJ 2216】【POI 2011】Lightning Conductor
http://www.lydsy.com/JudgeOnline/problem.php?id=2216 学习了一下决策单调性. 这道题决策单调性比较明显,不详细证了. 对于一个决策i,如果在i之前的 ...
- 【BZOJ 2212】【POI 2011】Tree Rotations
http://www.lydsy.com/JudgeOnline/problem.php?id=2212 自下而上贪心. 需要用权值线段树来记录一个权值区间内的出现次数. 合并线段树时统计逆序对的信息 ...
- bzoj 2276 [ Poi 2011 ] Temperature —— 单调队列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2276 维护 l 递减的单调队列,队头的 l > 当前的 r 就出队,因为不能是连续一段 ...
- [ POI 2011 ] Party
\(\\\) \(Description\) 给定一张 \(N\ (\ N\equiv 0\pmod{3}\ )\) 个节点,,\(M\)条边的图,并且保证该图存在一个大小至少为\(\frac{2}{ ...
- 洛谷 P3515 [ POI 2011 ] Lightning Conductor —— 决策单调性DP
题目:https://www.luogu.org/problemnew/show/P3515 决策单调性... 参考TJ:https://www.cnblogs.com/CQzhangyu/p/725 ...
- Solution -「POI 2011」「洛谷 P3527」MET-Meteors
\(\mathcal{Description}\) Link. 给定一个大小为 \(n\) 的环,每个结点有一个所属国家.\(k\) 次事件,每次对 \([l,r]\) 区间上的每个点点权加上 ...
- POI题解整合
我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...
随机推荐
- rename命令详解
基础命令学习目录首页 原文链接:http://man.linuxde.net/rename 将main1.c重命名为main.c rename main1.c main.c main1.c renam ...
- Windows搭建python开发环境
python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 基本概念Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum ...
- 基于LiFi可见光通信技术的研究及应用转化调查
这个仅是本人的部分调研结果,有同行做可见光研究的可以联系交流,QQ:391349683
- 请教JDBC中的thin和OCI的区别\
请教JDBC中的thin和OCI的区别 https://zhidao.baidu.com/question/2267123737573204748.html
- OO第四次作业-对前三次作业总结
第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...
- Linux基础入门--04
目录结构及文件基本操作 实验介绍: 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录结构之 ...
- C#中周,月,第几周,周开始结束时间de方法总结
1.c#获取当前时间是本年的第几周,本月的第几周 private static int getWeekNumInMonth(DateTime daytime) { int dayInMonth = d ...
- 编程之法section II: 2.1 求最小的k个数
====数组篇==== 2.1 求最小的k个数: 题目描述:有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 解法一: 思路:快排后输出前k个元素,O(nlogn). writer: zz ...
- Alpha 冲刺报告(4/10)
Alpha 冲刺报告(4/10) 队名:洛基小队 峻雄(组长) 已完成:继续行动脚本的编写 明日计划:尽量完成角色的移动 剩余任务:物品背包交互代码 困难:具体编码进展比较缓慢 ----------- ...
- 对WEB url 发送POST请求
package com.excellence.spark; import java.util.List; import com.excellence.spark.test.test; import c ...