题目大意:给定一棵树,有一些点是关键点,要求选择不超过m个点。使得全部关键点到近期的选择的点距离最大值最小

二分答案,问题转化为:

给定一棵树,有一些点是关键点,要求选择最少的点使得每一个关键点到选择的点的距离不超过limit

然后我们贪心DFS一遍

对于以一个节点为根的子树,有三种状态:

0.这棵子树中存在一个选择的点,这个选择的点的贡献还能继续向上传递

1.这棵子树中存在一个未被覆盖的关键点,须要一些选择的点去覆盖他

2.这棵子树中既没有能继续向上传递的选择的点也不存在未覆盖的关键点

是不是少了一种状态?假设这棵子树中既存在能继续向上传递的选择的点又存在未被覆盖的关键节点呢?

这样的状态能够被归进另外一种状态中。由于我们须要一个子树外的节点被选择去覆盖这个未覆盖的关键点,那么假设子树内的选择节点还能够覆盖子树外的某个关键节点,那么子树外的选择节点一定也能够覆盖这个关键节点。子树内的选择节点的贡献失去了意义,因此能够被归为状态2

假设是状态0,记录这个点的贡献还能向上传递多少

假设是状态1,记录子树中离根节点最远的未被覆盖的关键点的距离

然后贪心即可了

时间复杂度O(nlogn)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 300300
using namespace std;
struct abcd{
int to,next;
}table[M<<1];
int head[M],tot;
int n,m,cnt,a[M];
int f[M],sta[M];
/*
0-已经被覆盖
1-须要被覆盖
2-没有被覆盖,也不须要被覆盖
*/
void Add(int x,int y)
{
table[++tot].to=y;
table[tot].next=head[x];
head[x]=tot;
}
void Tree_DP(int x,int from,int limit)
{
int i,nearest_fire=-1,farthest_dynamic=a[x]-1;
for(i=head[x];i;i=table[i].next)
if(table[i].to!=from)
Tree_DP(table[i].to,x,limit);
for(i=head[x];i;i=table[i].next)
if(table[i].to!=from)
{
if(sta[table[i].to]==0)
nearest_fire=max(nearest_fire,f[table[i].to]-1);
else if(sta[table[i].to]==1)
farthest_dynamic=max(farthest_dynamic,f[table[i].to]+1);
}
if(nearest_fire<farthest_dynamic)
{
if(farthest_dynamic==limit)
{
++cnt;
f[x]=limit;
sta[x]=0;
}
else
{
f[x]=farthest_dynamic;
sta[x]=1;
}
}
else if(nearest_fire!=-1)
{
f[x]=nearest_fire;
sta[x]=0;
}
else
{
f[x]=0;
sta[x]=2;
}
}
bool Judge(int x)
{
cnt=0;
Tree_DP(1,0,x);
if(sta[1]==1)
++cnt;
return cnt<=m;
}
int Bisection()
{
int l=0,r=n;
while(r-l>1)
{
int mid=l+r>>1;
if( Judge(mid) )
r=mid;
else
l=mid;
}
return Judge(l)? l:r;
}
int main()
{
int i,x,y;
cin>>n>>m;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
Add(x,y);Add(y,x);
}
cout<<Bisection()<<endl;
return 0;
}

BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心的更多相关文章

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

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

  2. Bzoj 2525 [Poi2011]Dynamite

    2525: [Poi2011]Dynamite Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 240  Solved: 120[Submit][Sta ...

  3. 【BZOJ2525】[Poi2011]Dynamite(二分,树形dp)

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

  4. bzoj 2525: [Poi2011]Dynamite【二分+树上贪心】

    一眼二分.然后重点是树上贪心部分 长得像dp一样,设mn为子树内已炸点的最浅点,mx为子树内没有炸并且需要炸的最深点,然后转移直接从子树继承即可 然后是判断当前u点是否需要炸,当mx[u]+mn[u] ...

  5. HDU 3586 二分答案+树形DP判定

    HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...

  6. BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP

    BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ...

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

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

  8. NOIP2012疫情控制(二分答案+倍增+贪心)

    Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...

  9. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

随机推荐

  1. CSS2简写代码(优化)

    [1]如果CSS属性值为0,那么你不必为其添加单位(如:px/em): 下面是你可能的写法: padding: 10px 5px 0px 0px; 但是你可能这样写: padding: 10px 5p ...

  2. Python快速排序

    快排,取一个key值,一般取第一个即可,将小于key的放到左边,大于key的放到右边,递归实现 import random def quicksort(data, low = 0, high = No ...

  3. VMware内安装Ubuntu后安装vmtools

    今天处于好奇安装了Ubuntu,可是虚拟机运行的时候发现界面很小,于是百度发现要安装一个工具,看了很多方法,就这个比较实用,和大家分享: 第一步:进入系统后,点击虚拟机上的安装vmware tools ...

  4. 【产品体验】echo回声

    本人产品新人,学习中,希望大家用过该产品的给点意见,不吝赐教哦~~ 先来两张echo的界面图镇楼——        echo简介: “echo”是一款做声音社交的APP,在这里,你可以感受到声音无限的 ...

  5. BZOJ 2242 计算器

    Description 你被要求设计一个计算器完成以下三项任务: \(1.\)给定\(y,z,p\),计算\(y^{z}\;mod\;P\)的值: \(2.\)给定\(y,z,p\),计算满足\(xy ...

  6. socket、tcp、http

    第一部分.概念的理解 1.什么是Socket? Socket又称之为“套接字”,是系统提供的用于网络通信的方法.它的实质并不是一种协议,没有规定计算机应当怎么样传递消息,只是给程序员提供了一个发送消息 ...

  7. poj 3667 Hotel

    昨天学习了线段树的延迟标记: 发现自己还有区间合并没有学: 抓紧时间学习一下: 代码: #include<cstdio> #include<algorithm> #define ...

  8. web sql Database

    http://www.ibm.com/developerworks/cn/web/1108_zhaifeng_websqldb/ http://baishanheishui.iteye.com/blo ...

  9. Volatile总结

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...

  10. Java同步

    同步:★★★★★ 好处:解决了线程安全问题. 弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁. 定义同步是有前提的: 1,必须要有两个或者两个以上的线程,才需要同步. 2,多个线程必须保证使用 ...