BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心
题目大意:给定一棵树,有一些点是关键点,要求选择不超过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 二分答案+树形贪心的更多相关文章
- bzoj 2525 [Poi2011]Dynamite 二分+树形dp
[Poi2011]Dynamite Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 270 Solved: 138[Submit][Status][D ...
- Bzoj 2525 [Poi2011]Dynamite
2525: [Poi2011]Dynamite Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 240 Solved: 120[Submit][Sta ...
- 【BZOJ2525】[Poi2011]Dynamite(二分,树形dp)
[BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...
- bzoj 2525: [Poi2011]Dynamite【二分+树上贪心】
一眼二分.然后重点是树上贪心部分 长得像dp一样,设mn为子树内已炸点的最浅点,mx为子树内没有炸并且需要炸的最深点,然后转移直接从子树继承即可 然后是判断当前u点是否需要炸,当mx[u]+mn[u] ...
- HDU 3586 二分答案+树形DP判定
HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...
- BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP
BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ...
- 【BZOJ2525】[Poi2011]Dynamite 二分+树形DP
[BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...
- NOIP2012疫情控制(二分答案+倍增+贪心)
Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...
- BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...
随机推荐
- JS禁止横竖屏切换,强制横竖屏显示
js判断屏幕横竖屏: function orient() { //alert('gete'); if (window.orientation == 0 || window.orientation == ...
- svn服务器时间与本地时间不同步解决
在用svn的时候,由于svn的时间与本地不同步,导致每次看log总是需要对时间. 今天修改了svn服务器时间与本地同步.只需要修改svn服务器时间与本地时间相同即可,但要主要修改时区,不然会出现时间又 ...
- PHPCMS栏目调用2
{php $j=1;} {loop subcat(50) $v} {php if($v['type']!=0) continue;} ...
- Hadoop, Python, and NoSQL lead the pack for big data jobs
Hadoop, Python, and NoSQL lead the pack for big data jobs Rise in cloud-based analytics could incr ...
- 从一个模板函数聊聊模板函数里面如何获得T的名字
写了个小程序,遇到点问题.总结总结,学习学习 #include<vector> #include<iostream> #include<typeinfo> usin ...
- 简单学C——第三天
控制结构(二) 前面我们已经了解到了,控制结构中的判断结构,当然switch语句也是判断语句.不过如果if...else...语句你会了,我相信switch语句你也一定会的,它们的功能都是差不 ...
- C++ 利用socket实现TCP,UDP网络通讯
学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...
- 【JavsScript】XMLHttpRequest2的进步之处
本文参考自:XMLHttpRequest2 新技巧 (重点保留demo,方便自己日后查阅) HTML5是现在web开发中的热点,虽然关于web app和local app一直有争论,但是从技术学习的角 ...
- 大数据计算新贵Spark在腾讯雅虎优酷成功应用解析
http://www.csdn.net/article/2014-06-05/2820089 摘要:MapReduce在实时查询和迭代计算上仍有较大的不足,目前,Spark由于其可伸缩.基于内存计算等 ...
- 协定类型不具有 ServiceContractAttribute 特性
协定类型 ZBMService.QueryHistoryData 不具有 ServiceContractAttribute 特性.若要定义有效协定,指定的类型(协定接口或服务类)必须具有 Servic ...