【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp
输入
输出
样例输入
7
1 2
1 3
2 5
2 6
7 2
4 1
样例输出
3
题解
二分+树形dp
建议大家读读原题面 = =
读懂题后可以发现:
Bob(伏地魔)的移动路线一定是从根节点到一个叶子节点的一条路径,因为走回头路实在是太傻逼了...
Alice(凤凰社)只需要每次将每次移动的叶子节点染黑即可,每次一定是优先染叶子节点(因为下一步就要走到),多余的补后面的部分。
答案显然具有单调性,考虑二分答案。
对于二分的 $k=mid$ ,使用树形dp判定:
设 $f[x]$ 表示Bob走到了 $x$ 节点,仅有 $x$ 染黑,需要额外染多少个黑点才能够完成(也就是说之前需要多出多少个剩余操作次数才能够满足条件)。
那么对于 $x$ ,显然 $f[x]=\text{max}(\sum\limits_{fa[y]=x}f[y]+son[x]-mid,0)$ ($son[x]$ 表示 $x$ 的儿子个数),因为子节点需要染黑,每个儿子都需要补全(否则Bob可以选择该儿子)。而这一个点多余的的不能补给路径上之前的点,因此和 $0$ 取 $\text{max}$ 。
如果 $f[1]=0$ ,说明不需要额外补充节点,$mid$ 可行;否则 $mid$ 不可行。
时间复杂度 $O(n\log n)$ 。
#include <cstdio>
#include <algorithm>
#define N 300010
using namespace std;
int head[N] , to[N << 1] , next[N << 1] , cnt , son[N] , f[N] , mid;
inline void add(int x , int y)
{
to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
void init(int x , int fa)
{
int i;
for(i = head[x] ; i ; i = next[i])
if(to[i] != fa)
son[x] ++ , init(to[i] , x);
}
void dfs(int x , int fa)
{
int i;
f[x] = son[x] - mid;
for(i = head[x] ; i ; i = next[i])
if(to[i] != fa)
dfs(to[i] , x) , f[x] += f[to[i]];
if(f[x] < 0) f[x] = 0;
}
int main()
{
int n , i , x , y , l , r , ans;
scanf("%d" , &n);
for(i = 1 ; i < n ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
init(1 , 0);
l = 0 , r = n;
while(l <= r)
{
mid = (l + r) >> 1 , dfs(1 , 0);
if(f[1] == 0) ans = mid , r = mid - 1;
else l = mid + 1;
}
printf("%d\n" , ans);
return 0;
}
【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp的更多相关文章
- BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案
题目大意: 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜.求能让A获胜的最 ...
- 「JSOI2013」哈利波特和死亡圣器
「JSOI2013」哈利波特和死亡圣器 传送门 首先二分,这没什么好说的. 然后就成了一个恒成立问题,就是说我们需要满足最坏情况下的需求. 那么显然在最坏情况下伏地魔是不会走回头路的 因为这显然是白给 ...
- 【题解】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的点配对,然后一条断在这 ...
- HDU 3586 Information Disturbing (二分+树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...
- 【BZOJ2525】[Poi2011]Dynamite 二分+树形DP
[BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...
随机推荐
- 2017-2018-2 《网络对抗技术》 20155322 第二周 Exp1 PC平台逆向破解(5)M
#2017-2018-2 <网络对抗技术> 20155322 第二周 Exp1 PC平台逆向破解(5)M [博客目录] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 ...
- 20155336 2016-2017-2《Java程序设计》课程总结
20155336虎光元<Java程序设计>课程总结 一.每周作业 第一周学习总结:http://www.cnblogs.com/hxl681207/p/6457919.html 第二周学习 ...
- sort与qsort的异同
主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int widt ...
- Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)
/** * Created by LiuHuiChao on 2016/11/15. * description:based on TCP/IP+NIO to deliver the message ...
- day 4 名片管理系统 -函数版
修改没有用函数的程序 具有独立功能的代码块 源程序 #1.打印功能信息 print("*"*50) print("\t名片管理系统 V3\t") print(& ...
- javaweb(二十六)——jsp简单标签标签库开发(二)
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- 初遇python进程
计算机硬件组成 主板 固化(寄存器,是直接和cpu进行交互的一个硬件) cpu 中央处理器:计算(数字计算和逻辑计算)和控制(控制所有硬件协调工作) 存储 硬盘,内存 输入设备 键盘,鼠标,话筒 输出 ...
- nexus实现从windows迁移至Linux平台
说明: 由于老环境是在本地windows 2008 R2里面搭建的nexus,前面搭建了jenkins,需要将maven私库迁移至云服务器的CentOS 7系统下,之前没做过nexus的迁移,在网上看 ...
- Python函数标注
Python函数标注 是关于用户自定义函数中使用的类型的完全可选元数据信息. 函数标注 以Python字典的形式存放在函数的 __annotations__ 属性中,并且不会影响函数的任何其他部分. ...
- 第1章 Python基础
一.安装Python windows: 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python27 3.配置环境 ...