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, ...
随机推荐
- WPF之Treeview控件简单用法
TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...
- Mac上RoR环境搭建问题
昨天一晚上折磨的我啊都快疯掉了. 按照http://railstutorial-china.org方法配制,到rvm requirements这个命令执行时就麻烦事来了. WutekiMacBook- ...
- 怎么跳出MySQL的10个大坑
淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合作,共向 ...
- Hibernate 注解 字段不映射的注解
在字段前面加这个注解:@Transient
- Altium Designer 定义板子外框
Altium Designer 提供多种定义板子外形的方法. 第一种方法,在Files 面板(在界面下面System菜单条中查找)中选择PCB Templates命令.在这个界面下您可以选择符合您设计 ...
- 15个你不知道的杀手级Google Chrome功能
之前写过一篇我为什么使用Google Chrome浏览器,算是在使用了一段时间的Google Chrome后的一点粗浅认识,最近读到一篇文章15 Killer Google Chrome Featur ...
- Delphi如何让程序最小化到任务栏(截取WM_SYSCOMMAND后,调用Shell_NotifyIcon)
现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标.象FoxMail 3.0 NetVampire 3.0等都提供了这样的功 ...
- MVVM in Depth
这篇文章开始粗略的介绍了软件开发中松耦合的概念并讲述了使用MVC.MVP和MVVM三种模式达到松耦合.然后分析了这三种模式适用范围,其中: MVC(Model-View-Controller)适用于w ...
- 小细节:Java中split()中的特殊分隔符 小数点
这两天做项目过程中由于数据表字段设计的太恶心了,导致自己填坑 关于微信支付和支付宝的支付有一个不同点:就是金额的处理,支付宝金额的单位是0.01元,但是微信支付中1表示0.01元,当时设计价格的时候使 ...
- canvas——画板
注意部分: canvas的height和width不能再css中设定,应该在html中设定,否则会影响页面的分辨率. 效果图: 图1: 代码 css: #canvas{ cursor: crossha ...