bzoj 3420: Poi2013 Triumphal arch 树形dp+二分
给一颗树,$1$ 号节点已经被染黑,其余是白的,两个人轮流操作,一开始 $B$ 在 $1$ 号节点,$A$ 选择 $k$ 个点染黑,然后 $B$ 走一步,如果 $B$ 能走到 $A$ 没染的节点则 $B$ 胜,否则当 $A$ 染完全部的点时,$A$ 胜。求能让 $A$ 获胜的最小的 $k$
我们发现这个 $k$ 是满足单调性的:即如果 $k$ 是一个合法的解,那么 $k+1$ 也一定合法,所以考虑二分 $k$
现在,我们考虑如果得到一个 $mid$,如何验证 $mid$ 是否合法呢 $?$
这个状态的设计不太好想:$f[i]$ 表示当 $B$ 到达 $i$ 节点且 $B$ 为后手时 $i$ 的子树中需要被染成黑色的最小数量(不考虑 $i$ 的染色情况).
如果 $f[1]$ 小于等于 $k$ 的话,则合法.
考虑如何转移:
对于 $i$ 的所有子树来说,答案是 $\sum_{v\in son[i]}f[v]+1$
因为我们并不考虑一个节点自身的染色情况,所以所有儿子也必须都被提前染上色.
而由于 $B$ 是后手,$A$ 是先手,所以 $A$ 可以提前将 $k$ 个点先染完,所以:
$f[i]=max(0,\sum_{v\in son[i]}(f[v]+1)-k)$
每一次二分出一个 $k$ 就这么转移一下就好了.
#include <bits/stdc++.h>
#define N 300005
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,edges,k;
int hd[N],to[N<<1],nex[N<<1],f[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int u,int ff)
{
int tot=0;
f[u]=-k;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
dfs(v,u);
f[u]+=f[v]+1;
}
// printf("%d %d\n",u,f[u]);
f[u]=max(f[u], 0);
}
int main()
{
// setIO("input");
int i,j;
scanf("%d",&n);
for(i=1;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v),add(u,v),add(v,u);
}
int l=0,r=n,ans=n;
while(l<=r)
{
int mid=(l+r)>>1;
for(i=1;i<=n;++i) f[i]=0;
k=mid, dfs(1,0);
if(f[1]==0) ans=mid, r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}
bzoj 3420: Poi2013 Triumphal arch 树形dp+二分的更多相关文章
- BZOJ 3420: Poi2013 Triumphal arch
二分答案 第二个人不会走回头路 那么F[i]表示在i的子树内(不包括i)所需要的额外步数 F[1]==0表示mid可行 k可能为0 #include<cstdio> #include< ...
- [bzoj3420]Poi2013 Triumphal arch_树形dp_二分
Triumphal arch 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=3420 数据范围:略. 题解: 首先,发现$ k $具有单调性,我们 ...
- bzoj 3872: [Poi2014]Ant colony -- 树形dp+二分
3872: [Poi2014]Ant colony Time Limit: 30 Sec Memory Limit: 128 MB Description There is an entranc ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案
题目大意: 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜.求能让A获胜的最 ...
- hdu 3586 Information Disturbing(树形dp + 二分)
本文出自 http://blog.csdn.net/shuangde800 题目链接: hdu-3586 题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费 ...
- hdu 3586 树形dp+二分
题目大意:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵 树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线.现要切断前线和司令部的联系,每次切断边的费用不能超过上限lim ...
随机推荐
- 【HC89S003F4开发板】 7ASM&C混合编程
HC89S003F4开发板ASM&C混合编程 一.前言 在配套资料里有实现ASM&C混合编程的说明文档,这里来实现这个功能. 二.实现ASM&C混合编程 1.打开 Keil 工 ...
- Powershell学习笔记:(二)、基础知识
从Window7以后,WIndows系统都自带了Windows PowerShell. 自带版本如下 WIndow7 2.0 WIndow8 3.0 Window8.1 4.0 Win ...
- IClientMessageInspector IDispatchMessageInspector
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ajax中的事件
blur : 当光标移开时(点击)触发 change : 当光标移开并且文本框中的内容和上一次不一致时(点击)触发
- python路径相关处理
一.绝对路径 import os path1=os.path.abspath('.') #表示当前所处的文件夹的绝对路径 print(path1) path2=os.path.abspath('..' ...
- stm32 内部flash
嵌入式闪存 闪存存储器有主存储块和信息块组成 大容量产品主存储块最大为64K×64位,每个存储块划分为256个2K字节的页 编程和擦除闪存 闪存编程一次可以写入16位(半字) 闪存擦除操作可以按页面擦 ...
- jenkins中的流水线( pipeline)的理解(未完)
目录 一.理论概述 Jenkins流水线的发展历程 什么是Jenkins流水线 一.理论概述 pipeline是流水线的英文释义,文档中统一称为流水线 Jenkins流水线的发展历程 在Jenki ...
- SAP ETL DS
如何设置Dataservices使用FTP传输方式_连接SAP系统 [如果DS的目标数据库选择使用Oracle,请务必确认以下数据库设置] If SAP R3 contents CJK charact ...
- Keras实现Hierarchical Attention Network时的一些坑
Reshape 对于的张量x,x.shape=(a, b, c, d)的情况 若调用keras.layer.Reshape(target_shape=(-1, c, d)), 处理后的张量形状为(?, ...
- Django之简介
一.MVC模型与MTV模型 MVC模型就是Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起 ...