[ POI 2011 ] Dynamite
\(\\\)
\(Description\)
一棵\(N\)个节点的树,树上有\(M\)个节点是关键点,选出\(K\)个特殊点,使得所有关键点到特殊点的距离中最大的最小,输出最大值最小为多少。
- \(N\in [1,3\times 10^5]\),\(M,K\in [1,N]\)
\(\\\)
\(Solution\)
神仙树形DP验证方式
- 首先最大值最小一眼二分,关键在于怎么\(check\)这个二分得到的最远距离。
- 正解树型\(DP\),假设所有子树已经处理完毕,显然可以靠贡献和需求分为四类;
- \(0\):可向上贡献,子树内已全部覆盖
- \(1\):可向上贡献,子树内有待覆盖节点
- \(2\):无可向上覆盖,子树内已全部覆盖
- \(3\):无可向上覆盖,子树内有待覆盖节点
- 有趣的是发现\(1\)和\(3\)两类子树根节点的情况可合并,即\(1\)类节点的贡献是无意义的,为什么呢?因为子树内的点无法被覆盖,证明有贡献的点从根节点再往外的贡献长度是小于待覆盖节点到子树根节点距离的。而子树外的点若能够满足覆盖子树内待覆盖节点的要求,则外部节点从当前子树根节点延申出的长度为二倍的二分答案再减掉待覆盖节点到子树根节点的距离,显然比上一个长。于是点分类改为:
- \(0\):可向上贡献,子树内已全部覆盖
- \(1\):无可向上覆盖,子树内有待覆盖节点
- \(2\):无可向上覆盖,子树内已全部覆盖
- 设\(f[i]\)表示\(i\)号节点:向上最长贡献距离\((1)/\)子树内待覆盖节点到\(i\)号节点最大距离\((2)/0(3)\)。
- 然后就考虑当前节点的状态。统计所有有贡献的节点在根节点处的最大延申距离,即\(mx_1=max(mx_1,f[i]-1)\);统计所有待覆盖节点到当前根节点处最大距离,即\(mx_2=max(mx_2,f[i]+1)\)。
- 分情况讨论当前节点状态,注意若子树内待覆盖节点距离等于二分长度,当前点应设为特殊点,同时注意特判\(2\)类节点即可。
- 还要注意在树型\(DP\)后若\(1\)号节点是待覆盖的使用节点数要\(+1\)。
\(\\\)
\(Code\)
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 300010
#define R register
#define gc getchar
using namespace std;
int n,m,tot,cnt,d[N],hd[N];
int f[N],tag[N];
struct edge{int to,nxt;}e[N<<1];
inline void add(int u,int v){
e[++tot].to=v; e[tot].nxt=hd[u]; hd[u]=tot;
}
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
inline void dfs(int u,int fa,int lim){
int mn=-1,mx=d[u]-1;
for(R int i=hd[u];i;i=e[i].nxt)
if(e[i].to!=fa) dfs(e[i].to,u,lim);
for(R int i=hd[u];i;i=e[i].nxt)
if(e[i].to!=fa){
if(tag[e[i].to]==0) mn=max(mn,f[e[i].to]-1);
else if(tag[e[i].to]==1) mx=max(mx,f[e[i].to]+1);
}
if(mn<mx){
if(mx==lim){++cnt; f[u]=lim;tag[u]=0;}
else{f[u]=mx;tag[u]=1;}
}
else if(mn!=-1){f[u]=mn; tag[u]=0;}
else{f[u]=0;tag[u]=2;}
}
inline bool valid(int x){
cnt=0; dfs(1,0,x);
if(tag[1]==1) ++cnt;
return cnt<=m;
}
int main(){
n=rd(); m=rd();
for(R int i=1;i<=n;++i) d[i]=rd();
for(R int i=1,u,v;i<n;++i){
u=rd(); v=rd(); add(u,v); add(v,u);
}
int l=0,r=n;
while(l<r){
int mid=((l+r)>>1);
valid(mid)?r=mid:l=mid+1;
}
printf("%d\n",l);
return 0;
}
[ POI 2011 ] Dynamite的更多相关文章
- 解题:POI 2011 Dynamite
题面 从零开始的DP学习系列之叁 树形DP的基本(常见?)思路:先递归进儿子,然后边回溯边决策,设状态时常设$dp[x]$表示以$x$为根的子树中(具体分析算不算$x$这个点)的情况 显然的二分答案, ...
- 解题: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 箱子位置单调,所以 ...
随机推荐
- [codeVS3943] 数学奇才琪露诺
题目描述 Description 作为上白泽慧音老师的出色弟子,数学奇才琪露诺在算术方面有很深的造诣.今天,codevs有幸请到了这位数学界的奇葩作为本场考试的第一题主考官. 琪露诺喜欢0-9之间的数 ...
- The Pilots Brothers' refrigerator DFS+枚举
Description The game “The Pilots Brothers: following the stripy elephant” has a quest where a player ...
- I - 最少拦截系统
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ],su ...
- Screenshot: available via screen
在使用selenium+PhantomJS进行爬虫时候报错 selenium.common.exceptions.TimeoutException: Message: Screenshot: avai ...
- Spring Boot中使用Swagger2生成RESTful API文档(转)
效果如下图所示: 添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!-- https://mvnrepository.com/artifact/io.springfox ...
- MVC中从控制器到视图的数据传递方法汇总
1.ViewData对象概述ViewData是一种字典集合数据,是"视图基类"和"控制器基类"的属性常见用法是在控制器中写入数据,在视图中读取数据ViewDat ...
- JavaSE学习笔记--Item1 注解Annotation
从 JDK 5.0 開始, Java 添加了对元数据(MetaData) 的支持, 也就是 Annotation(注解). 什么是Annotation,以及注解的作用? 三个主要的 Annotatio ...
- Android 应用按返回键异常退出的问题
开发过程中遇到按返回键异常退出的问题,log显示为空指针异常,进一步产看是由于onActivityResult得到的Intent为空. 按返回键复写代码例如以下: @Override public v ...
- LeetCode 680. Valid Palindrome II (验证回文字符串 Ⅱ)
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...
- Codeforces Round #272 (Div. 2) D.Dreamoon and Sets 找规律
D. Dreamoon and Sets Dreamoon likes to play with sets, integers and . is defined as the largest p ...