BZOJ2525: [Poi2011]Dynamite
2016-04-07 00:08
381 查看
刚看的时候看错题了…被调侃了一发,以为只能选择1个点…
考虑二分答案,我们只需要判定是否存在个点能够在mid范围内到达所有关键点。
最暴力的judge是从每个点bfs一遍看看mid范围能是否能覆盖到所有的点,这样我们得到了一个n^2logn的优秀算法…
之所以要二分是因为二分完了之后可以贪心嘛…所以考虑树形贪心。一个关键点要么被它的子树内的点管理,要么被它子树外的点管理,于是我们记录两个值,first表示以x为根的子树中目前还没有人管理的关键点距离x的最远的距离,second表示以x为根的子树中选择了的点距离x的最近的距离。
显然if(first+second<=mid)以x为根的数是可以自己处理的,但是if(first==mid)就意味着必须要选择x这个点了, 因为在向上一个点距离就超过mid了,这时候强制选择x这个点,并更新first,second即可。
注意树形贪心结束要判断一下1号节点是不是已经处理完了哦…
嗯…代码的话非常简洁
考虑二分答案,我们只需要判定是否存在个点能够在mid范围内到达所有关键点。
最暴力的judge是从每个点bfs一遍看看mid范围能是否能覆盖到所有的点,这样我们得到了一个n^2logn的优秀算法…
之所以要二分是因为二分完了之后可以贪心嘛…所以考虑树形贪心。一个关键点要么被它的子树内的点管理,要么被它子树外的点管理,于是我们记录两个值,first表示以x为根的子树中目前还没有人管理的关键点距离x的最远的距离,second表示以x为根的子树中选择了的点距离x的最近的距离。
显然if(first+second<=mid)以x为根的数是可以自己处理的,但是if(first==mid)就意味着必须要选择x这个点了, 因为在向上一个点距离就超过mid了,这时候强制选择x这个点,并更新first,second即可。
注意树形贪心结束要判断一下1号节点是不是已经处理完了哦…
嗯…代码的话非常简洁
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define fir first #define sec second #define mp make_pair #define pii pair<int,int> //by:MirrorGray using namespace std; const int N=611111,inf=0x3f3f3f3f; int mid,lala,d ,tot=-1,head ,ver ,nxt ; void add(int x,int y){ nxt[++tot]=head[x]; head[x]=tot; ver[tot]=y; } pii dfs(int x,int f){ pii ret=mp(-inf,inf); for(int i=head[x];~i;i=nxt[i])if(ver[i]!=f){ pii tmp=dfs(ver[i],x); ret.fir=max(ret.fir,tmp.fir+1); ret.sec=min(ret.sec,tmp.sec+1); } if(d[x]&&ret.sec>mid)ret.fir=max(0,ret.fir); if(ret.fir+ret.sec<=mid)ret.fir=-inf; if(ret.fir==mid)lala++,ret.fir=-inf,ret.sec=0; return ret; } int main(){ memset(head,-1,sizeof(head)); int n,m;scanf("%d%d",&n,&m); int sum=0; for(int i=1;i<=n;i++)scanf("%d",&d[i]),sum+=d[i]; for(int i=1;i<n;i++){ int a,b;scanf("%d%d",&a,&b); add(a,b);add(b,a); } int l=0,r=n,ans=-1; while(l<=r){ mid=(l+r)>>1; lala=0;pii tmp=dfs(1,-1); if(tmp.fir+tmp.sec>mid)lala++; if(lala<=m)ans=mid,r=mid-1; else l=mid+1; } printf("%d\n",ans); return 0; }
相关文章推荐
- 实现自动匹配的输入文本
- Z字形扫描
- ToggleButton 的功能 实现(同过实现OncheckChangeListener接口)
- oracle物理dg角色转换
- C++作业1
- 内核设计作业七
- Linux第七周学习总结——可执行程序的装载
- 第七十六天
- 按钮的监听事件--onClick
- SDAU 搜索专题 16 Red and Black
- Android 控件及其属性2
- 关于BooleanQuery在搜索中的用处
- Java 枚举
- 归并排序(mergeSort)之非递归算法
- 屌丝Cent OS服务解密
- Android 控件和其基本属性1
- placeholder 的兼容问题
- 在 Linux 下截屏并编辑的最佳工具
- ScreenCloud:一个增强的截屏程序
- Python检测网站链接是否已存在