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, ...
随机推荐
- 10个必看的PHP小代码,很实用!
获取浏览器IP地址 function getRemoteIPAddress() { $ip = $_SERVER['REMOTE_ADDR']; return $ip; } 如果有代理服务器的情况下获 ...
- 使用jQuery播放/暂停 HTML5视频
文章来自:http://blog.okbase.net/jquery2000/archive/4485.html 我尝试用jQuery控制HTML5视频,两个视频分别在两个tab中,我希望点中tab后 ...
- 计算机视觉的matlab工具箱及MVG等
MATLAB Functions for Multiple View Geometry Peter Kovesi's Matlab functions for Computer Vision Jean ...
- windows server 2012服务器IIS基本配置
- 对rsync进行封装的shell脚本
抓取 #!/bin/bash . push.sh # 错误处理:尝试查找备份文件 function onError() { local errFile="err" local se ...
- vc2010配置opencv2.4.4库(图文 转)
VC 2010下安装OpenCV2.4.4 说明: 安装平台:32位XP,VS2010: OpenCV 2.4.4不支持VC 6.0: 网上有很多用CMake编译OpenCV的安装教程,这 ...
- bzoj 1223: [HNOI2002]Kathy函数 数位DP 高精度
1223: [HNOI2002]Kathy函数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 207 Solved: 90[Submit][Stat ...
- BZOJ 2005 能量采集
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...
- [Codeforces Round #296 div2 D] Clique Problem 【线段树+DP】
题目链接:CF - R296 - d2 - D 题目大意 一个特殊的图,一些数轴上的点,每个点有一个坐标 X,有一个权值 W,两点 (i, j) 之间有边当且仅当 |Xi - Xj| >= Wi ...
- TCP三次握手和http过程
pc浏览服务器网页此过程不包括域名查询,只描述TCP与http数据流的变化.一.pc与http服务器进行三次握手来建立连接.1.pc:seq=0 ack=0 syn=1 ack=0 发送给服务器建立同 ...