BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心
来源:互联网 发布:人脸识别用什么算法 编辑:程序博客网 时间:2024/06/08 20:11
题目大意:给定一棵树,有一些点是关键点,要求选择不超过
二分答案,问题转化为:
给定一棵树,有一些点是关键点,要求选择最少的点使得每个关键点到选择的点的距离不超过
然后我们贪心DFS一遍
对于以一个节点为根的子树,有三种状态:
0.这棵子树中存在一个选择的点,这个选择的点的贡献还能继续向上传递
1.这棵子树中存在一个未被覆盖的关键点,需要一些选择的点去覆盖他
2.这棵子树中既没有能继续向上传递的选择的点也不存在未覆盖的关键点
是不是少了一种状态?如果这棵子树中既存在能继续向上传递的选择的点又存在未被覆盖的关键节点呢?
这种状态可以被归进第二种状态中,因为我们需要一个子树外的节点被选择去覆盖这个未覆盖的关键点,那么如果子树内的选择节点还可以覆盖子树外的某个关键节点,那么子树外的选择节点一定也可以覆盖这个关键节点,子树内的选择节点的贡献失去了意义,因此可以被归为状态2
如果是状态0,记录这个点的贡献还能向上传递多少
如果是状态1,记录子树中离根节点最远的未被覆盖的关键点的距离
然后贪心就行了
时间复杂度O(nlogn)
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 300300using 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;}
0 0
- BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心
- bzoj 2525: [Poi2011]Dynamite 二分答案+树形贪心
- BZOJ 2525 [Poi2011]Dynamite 二分+树形贪心
- [BZOJ2525][Poi2011]Dynamite 二分答案+贪心+树型DP
- [bzoj 2525]Poi2011 Dynamite
- BZOJ 2525: [Poi2011]Dynamite
- 树规+二分 [Poi2011]Dynamite
- BZOJ 2097 Exercise 奶牛健美操 二分答案+树形DP+贪心
- BZOJ 2067 POI 2004 SZN 树形DP 贪心 二分答案
- bzoj-2525 Dynamite
- BZOJ 2280 Poi2011 Plot 二分答案+随机增量法
- [二分答案 随机增量法] BZOJ 2280 [Poi2011]Plot
- BZOJ 2097 USACO 2010 Dec Gold Exercise 奶牛健美操 二分答案 树形DP 贪心
- BZOJ2525: [Poi2011]Dynamite
- BZOJ2525: [Poi2011]Dynamite
- BZOJ2525: [Poi2011]Dynamite
- [二分答案 贪心] BZOJ 3248 [ioi2013]robots
- bzoj 4753: [Jsoi2016]最佳团体 二分答案+树形dp
- 关于机顶盒焦点的文章
- Java中调用c语言示例
- Android Native/Tombstone Crash Log 详细分析
- Utterance API
- Android实现首次点击返回键提示信息,第二次点击退出应用
- BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心
- 一项很有生命力的技术(Ajax)
- 无线报文简单分析
- D3D中D3DFVF_XYZ和D3DFVF_XYZRHW的区别
- BaseDataProcessor API
- Android Studio 1.2版本设置安装配置教程(window平台)
- vs2013—未解决问题—编写简单的图片下载程序
- 设计模式C++实现(12)——备忘录模式2
- DataBlocker API