【BZOJ2525】[Poi2011]Dynamite(二分,树形dp)
【BZOJ2525】[Poi2011]Dynamite
Description
- 某个点上的引线被点燃后的1单位时间内,在树上和它相邻的点的引线会被点燃。如果一个有炸.药的点的引信被点燃,那么这个点上的炸.药会爆炸。
- 求引爆所有炸.药的最短时间。
- 输入:
- 第一行是两个整数N,M。(1<=m<=n<=300000)
- 接下来一行有N个整数Di,第I个数为1表示该点有炸.药。
- 接下来N-1行每行有两个数A,B,表示A和B之间有一条边。
- 输出:
- 最短时间。
- 样例解释:
- 点燃3,5上的引线。
Sample Input
1 0 1 1 0 1 1
1 3
2 3
3 4
4 5
5 6
5 7
Sample Output
- /*
- 二分答案。
- 然后接下来从下往上扫整棵树。
- 节点的状态有:
- 第一种 子树内没有不被覆盖的关键点,并且子树中有一个节点的贡献可以继续往上。
- 第二种 子树内有不被覆盖的关键点,子树中没有节点的贡献可以继续往上。
- 第三种 既没有 不被覆盖的关键点,又没有 可以继续往上贡献的点。
- 第四种 都有。
- 但是 可以证明,第四种情况存在的话,显然可以在子树外挑一个点来覆盖没有被覆盖的关键点,但是这个时候子树内的挑选的点就没有卵用了,所以这种情况可以归到第三种。
- 然后具体就是贪心讨论的过程了。
- 贪心的思想就是,能不染就不染
- 显然第一种需要记录还能往上走多少。
- 第二种需要记录最远的不被覆盖的关键点到达目前的根节点的距离
- */
- #include<iostream>
- #include<cstdio>
- #define N 300007
- using namespace std;
- int n,m,h[N],cnt,d[N],sum,sm,mx[N],mn[N];
- struct edge
- {
- int ne,to;
- }e[N<<];
- inline int read()
- {
- int x=,f=;char c=getchar();
- while(c>''||c<''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- void add(int u,int v)
- {
- e[++cnt].to=v;e[cnt].ne=h[u];h[u]=cnt;
- }
- void dfs(int u,int fa,int w)
- {
- mx[u]=-1e9,mn[u]=1e9;
- for(int i=h[u];i;i=e[i].ne)
- if(e[i].to!=fa)
- {
- dfs(e[i].to,u,w);
- mx[u]=max(mx[u],mx[e[i].to]+);
- mn[u]=min(mn[u],mn[e[i].to]+);
- }
- if(d[u]&&mn[u]>w) mx[u]=max(mx[u],);
- if(mx[u]+mn[u]<=w)mx[u]=-1e9;
- if(mx[u]==w) sm++,mx[u]=-1e9,mn[u]=;
- }
- bool ok(int w)
- {
- sm=;dfs(,,w);
- return sm+(mx[]>=)<=m;
- }
- int main()
- {
- n=read(),m=read();
- for(int i=;i<=n;i++)
- d[i]=read(),sum+=d[i];
- for(int i=;i<n;i++)
- {
- int x=read(),y=read();
- add(x,y),add(y,x);
- }
- if(sum<=m)
- {
- puts("");return ;
- }
- int l=,r=n,ans=n;
- while(l<=r)
- {
- int mid=(l+r)>>;
- if(ok(mid)) r=mid-,ans=mid;
- else l=mid+;
- }
- printf("%d\n",ans);
- return ;
- }
【BZOJ2525】[Poi2011]Dynamite(二分,树形dp)的更多相关文章
- 【BZOJ2525】[Poi2011]Dynamite 二分+树形DP
[BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...
- bzoj 2525 [Poi2011]Dynamite 二分+树形dp
[Poi2011]Dynamite Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 270 Solved: 138[Submit][Status][D ...
- 【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp
题目描述 给你一棵以1为根的有根树,初始除了1号点为黑色外其余点均为白色.Bob初始在1号点.每次Alice将其中至多k个点染黑,然后Bob移动到任意一个相邻节点,重复这个过程.求最小的k,使得无论B ...
- 【题解】hdu 3586 Information Disturbing 二分 树形dp
题目描述 Information DisturbingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java ...
- HDU 3586 Information Disturbing(二分+树形dp)
http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...
- HDU 5682 zxa and leaf 二分 树形dp
zxa and leaf 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5682 Description zxa have an unrooted t ...
- Codeforces 627D Preorder Test(二分+树形DP)
题意:给出一棵无根树,每个节点有一个权值,现在要让dfs序的前k个结点的最小值最大,求出这个值. 考虑二分答案,把>=答案的点标记为1,<答案的点标记为0,现在的任务时使得dfs序的前k个 ...
- bzoj 2067: [Poi2004]SZN【贪心+二分+树形dp】
第一问就是Σ(deg[u]-1)/2+1 第二问是二分,判断的时候考虑第一问的贪心规则,对于奇度数的点,两两配对之后一条延伸到上面:对于欧度数的点,两两配对或者deg[u]-2的点配对,然后一条断在这 ...
- BZOJ2525 [Poi2011]Dynamite 【二分 + 贪心】
题目链接 BZOJ2525 题解 就是要求所有有炸弹的点到点燃点距离最大值最小 显然二分答案距离\(D\) 然后按深度排序,贪心点燃当前没覆盖的深度最深的点往上第\(D\)层的点 每覆盖一个点要标记其 ...
随机推荐
- Android BGABadgeView:新消息/未接来电/未读消息/新通知圆球红点提示(1)
Android BGABadgeView:新消息/未接来电/未读消息/新通知圆球红点提示(1) 现在很多的APP会有新消息/未接来电/未读消息/新通知圆球红点提示,典型的以微信.QQ新消息提示为 ...
- ORACLE ASH/AWR
(一) ASH 用户在ORACLE数据库中执行操作时,必然要创建相应的连接和会话,其中,所有当前的会话信息都保存在动态性能视图V$SESSION中,通过该视图,DBA可以查看用户实际执行的操作,或者当 ...
- SQL SERVER 2012 第三章 T-SQL 基本语句 group by 聚合函数
select Name,salesPersonID From Sales.store where name between 'g' and 'j' and salespersonID > 283 ...
- cogs——1215. [Tyvj Aug11] 冗余电网
1215. [Tyvj Aug11] 冗余电网 ★ 输入文件:ugrid.in 输出文件:ugrid.out 简单对比 时间限制:1 s 内存限制:128 MB TYVJ八月月赛提高组 ...
- html5视频播放器 一 (改写默认样式)
一个项目用到了html5视频播放器,于是就写了一个,走了很多坑,例如在chrome中加载视频出现加载异常等 先看看效果 是不是感觉换不错,以下是我播放器改写样式的布局. <!DOCTYPE ht ...
- MongoDB小结20 - find【查询条件$size】
size可以获得指定数组长度的文档 db.user.find({"fruit":{"$size":3}},{"_id":0}) { &quo ...
- 实战!利用MSF批量扫描校园网中含有MS17_010漏洞的主机并入侵
利用ms17_010的永恒之蓝在前些日子火爆了一段时间,校园网中也声称封锁了相应端口.最近在搞MSF的深入学习,于是有了下文. ms17_010扫描工具 msf中的辅助模块含有一个强大的ms17_01 ...
- 用vhd挂载并安装win7且建立分差vhd
准备:硬盘分区激活第一个分区; imagex.exe; install.wim; winpe boot pc 1.cmd命令下,创建主vhd (1)diskpart (打开dis ...
- 看opengl写代码(7) 使用混合数组(glInterLeavedArrays)
glInterLeavedArrays 函数 有 三个 參数 : mode ,stride,pointer. mode :指示 开启 哪些 顶点数组,以及 顶点数组 使用的 数据类型. 其余的 顶点 ...
- android 特殊符号开头的联系人归并至“#”下
在PeopleActivity界面.联系人的显示位置是由其display name的第一个字符决定的. 数字开头的联系人会显示在"#"这个header下. 中英文联系人会显示在&q ...