BZOJ2525: [Poi2011]Dynamite

原创 2016年08月31日 15:25:31
题目大意:给一棵树,书上有一些关键节点,要求你选m个点,使得关键节点到这些点中距离的最小值的最大值最小,求这个值

先二分答案,转成判定性问题
考虑我们已经知道覆盖范围了,那么我们就要用最少的点来覆盖整个树
这一步用贪心就可以了,从下往上,直到必须放一个点的时候才放

为什么是对的呢?
我们考虑在一个不是必须放的地方放置了一个点,这样他们对于子树下面的影响是一样的,都是全部能覆盖
但是在下面放相对于在上面放来说,向上的延伸更少,所以贪心是对的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 300010
using namespace std;
bool spc[N];
int to[N<<1],nxt[N<<1],pre[N],cnt;
void ae(int ff,int tt)
{
	cnt++;
	to[cnt]=tt;
	nxt[cnt]=pre[ff];
	pre[ff]=cnt;
}
int L,tot;
int n,m;
int t[N];
int fa[N],f[N];
void dfs(int x)
{
	int i,j;
	int tmp1=-707185547,tmp2=-707185547;
	if(spc[x]) tmp1=0;
	for(i=pre[x];i;i=nxt[i])
	{
		j=to[i];
		if(j==fa[x]) continue;
		fa[j]=x;
		dfs(j);
		if(t[j]==1) tmp1=max(tmp1,f[j]+1);
		if(t[j]==2) tmp2=max(tmp2,f[j]-1);
	}
	if(tmp1>tmp2)
	{
		if(tmp1==L)
		{
			tot++;
			t[x]=2;
			f[x]=L;
		}
		else
		{
			t[x]=1;
			f[x]=tmp1;
		}
	}
	else
	{
		t[x]=2;
		f[x]=tmp2;
	}
}
bool judge(int x)
{
	L=x;
	tot=0;
	dfs(1);
	if(t[1]==1&&f[1]>=0) tot++;
	return (tot<=m);
}
int main()
{
	scanf("%d%d",&n,&m);
	int i,j,x,y;
	for(i=1;i<=n;i++)
	scanf("%d",&spc[i]);
	for(i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		ae(x,y);ae(y,x);
	}
	int l=0,r=n,mid;
	while(l<r)
	{
		mid=(l+r)>>1;
		if(judge(mid)) r=mid;
		else l=mid+1;
	}
	printf("%d",l);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ2525: [Poi2011]Dynamite

刚看的时候看错题了…被调侃了一发,以为只能选择1个点… 考虑二分答案,我们只需要判定是否存在个点能够在mid范围内到达所有关键点。 最暴力的judge是从每个点bfs一遍看看mid范围能是否能覆盖...

[bzoj 2525]Poi2011 Dynamite

记得这题还有个兄弟——poi2009 gas,至今还wa一个点。。。。 不管了,至少看上去这题比他兄弟和谐一点 首先毋庸置疑,肯定是二分答案。 O(n^2)的检查很好想吧。 从下向上扫描,...

BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心

题目大意:给定一棵树,有一些点是关键点,要求选择不超过mm个点,使得所有关键点到最近的选择的点距离最大值最小 二分答案,问题转化为: 给定一棵树,有一些点是关键点,要求选择最少的点使得每个关键点到...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年06月06日 16:44
  • 1453

BZOJ 2525 [Poi2011]Dynamite 二分+树形贪心

BZOJ 2525 [Poi2011]Dynamite 二分+树形贪心
  • wzq_QwQ
  • wzq_QwQ
  • 2015年10月03日 22:48
  • 1424

BZOJ 2525: [Poi2011]Dynamite

DescriptionByteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸药,现在需要点燃M个点上的引线引爆所有的炸药。 某个点上的引线被点燃后的1单位时间内,在树上和它...

bzoj 2525: [Poi2011]Dynamite 二分答案+树形贪心

某个点上的引线被点燃后的1单位时间内,在树上和它相邻的点的引线会被点燃。如果一个有炸药的点的引信被点燃,那么这个点上的炸药会爆炸。 求引爆所有炸药的最短时间。 1...

BZOJ2528: [Poi2011]Periodicity

题目大意:给定一个字符串S,其长度为N,如果对于任意的i(1 神TM构造题!!!!! 出题人脑洞太大了,这种题给tourist都不能现场做出来吧!!!(也不一定) VFK的题解讲的很好,...
  • commonc
  • commonc
  • 2016年08月31日 15:26
  • 438

bzoj-2525 Dynamite

题意: 给出一颗n个结点的树,上面有若干个关键结点; 现在可以在这些结点上选最多m个点,求最小化关键点到选择点的最大距离; 题解: 首先这道题是一个最大最小化的问题,很容易想到二分; ...

【BZOJ】【P2212&P3702】【Poi2011】【Tree Rotations】【二叉树】【题解】【启发式合并】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2212

BZOJ 2280 Poi2011 Plot 二分答案+随机增量法

题目大意:给定n个点,要求分成m段,使每段最小覆盖圆半径的最大值最小 二分答案,然后验证的时候把点一个个塞进最小覆盖圆中,若半径超了就分成一块…… 等等你在跟我说不随机化的随机增量法? 好吧 ...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年04月17日 19:14
  • 1566
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ2525: [Poi2011]Dynamite
举报原因:
原因补充:

(最多只允许输入30个字)