\(\\\)

\(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的更多相关文章

  1. 解题:POI 2011 Dynamite

    题面 从零开始的DP学习系列之叁 树形DP的基本(常见?)思路:先递归进儿子,然后边回溯边决策,设状态时常设$dp[x]$表示以$x$为根的子树中(具体分析算不算$x$这个点)的情况 显然的二分答案, ...

  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. nyoj 55 懒省事的小明(priority_queue优先队列)

    懒省事的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述       小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ...

  2. noip模拟赛 序

    [问题背景]zhx 给他的妹子们排序.[问题描述]zhx 有 N 个妹子, 他对第 i 个妹子的好感度为 ai,且所有 ai两两不相等. 现 在 N 个妹子随意站成一排, 他要将她们根据好感度从小到大 ...

  3. IM聊实现客户端之间信息交互需求文档

    终于放假啦~之前学习太忙很多知识点都没有写博客,可能自己学会了但没有分享给大家,接下来几天我可能把一些学过的东西整理成博客发出来供大家相互学习交流. 需求分析说明书 HuaXinIM聊软件 潘浩 20 ...

  4. 分享一个灰常好的 dapper 扩展插件: Rainbow

    dapper 是一个效率非常高的orm  框架 ,效率要远远大于 我们大微软的EF .    它只有一个类文件,非常之小.(在 EF 5.0 后 微软已经做了 改进) ps; 由于之前我也没测试过,只 ...

  5. Eclipse错误出现:Unable to install breakpoint in... (未能解决)

    Unable to install breakpoint in... Eclipse Unable to install breakpoint in  的问题还是没解决 1.重装eclipse无效 2 ...

  6. Windows下React Native开发01 -- Android开发环境搭建

    1.安装jdk 推荐将JDK的bin目录加入系统PATH环境变量(自己百度下怎么配置). 2.安装SDK 直接安装 Android Studio  推荐从AndroidDevTools下载.(也可以直 ...

  7. KonBoot – 只要5K映象文件轻易绕过您的WindowsXP/VISTA/7系统的密码

    http://pannisec.diandian.com/?tag=konBoot 这个东西是我昨晚点击了QQ弹窗的那个SOSO问题后,有人问我如何破解Windows登陆密码,且不可以用net命令创建 ...

  8. 交换机tagged与untagged的关系深入探讨

    端口接收数据时: 如果端口是tagged方式,当数据包本身不包含VLAN的话,输入的数据包就加上该缺省vlan:如果数据包本身已经包含了VLAN,那么就不再添加. 如果是untagged方式,输入的数 ...

  9. Linux下使用Vi是方向键变乱码 退格键不能使用的解决方法

    在Linux下编辑一些文件.这就涉及到了vi这个编辑器了.在Linux下,初始使用vi的时候有点问题.就是在编辑模式下使用方向键的时候,并不会使光标移动,而是在命令行中出现[A [B [C [D之类的 ...

  10. jq 地区(省市县区)联动菜单

    <pre name="code" class="html"><pre name="code" class="ph ...