题意

一棵树,每条边上都没有标记,现在有一个人要从S走到T,每次你先选择一条有标记的边,并且给这条边的标记消除,或者把一个没标记的边打上永久标记(你无法再次修改使其消除),然后这个人会走随机一条标记为0的边(相当于回合制),并把这条边的标记设为1,问最坏情况下,你至少要改变多少次边的标记才可以使这个人从S走到T。

数据范围

n,s,t≤106n,s,t\le10^6

解法

这个题,有一个部分分是S与T有直接连边,我们用树形dp处理出这个人到每个点的最小代价,我们首先考虑这种情况,那么最坏情况下我们肯定是选择把除了T以外的,最小代价最大的路径封死,那么这时候这个人就会走代价第二大的路径,然后我们再进入这颗子树继续dp就好了。
那么对于S与T不直接相连的情况,我们就把这条S到T的链上的所有点都这样做一次,考虑二分答案,那么对于这条链上的每个支链,我们都要封死,所以我们记录一下到这个点已经花的代价,然后看这个点的代价加上已经用过的代价是否大于二分值,还有之前的步数是否足够我封锁完这些边,就可以了。

收获

这个题的突破口就是首先根据部分分得出树形dp的解,然后想办法延伸到通解上。
对于通解,二分答案是很难想到的东西,并且在check过程中有很多细节需要考虑。

考点:

树形dp 二分答案

易错点:

各种细节

#include <bits/stdc++.h>
#define ll long long
#define lf double
#define E complex<lf>
#define inf 0x7fffffff
#define eps 1e-8
#define pa pair<int,int>
#define pb push_back
#define ms(x,y) memset(x,y,sizeof(x))
#define l(x) (x<<1)
#define r(x) (x<<1|1)
#define mod 1000000007
#define N 1000010
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();while (c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();return x*f;
}
int n,s,t,du[N],f[N],fa[N];
int nxt[N<<1],head[N],to[N<<1],tot=0;
inline void link(int x,int y) {nxt[++tot]=head[x],head[x]=tot,to[tot]=y;
}
inline void dfs(int x) {for (int i=head[x]; i; i=nxt[i]) {int j=to[i];if (j==fa[x]) continue;fa[j]=x,dfs(j);}if (du[x]==1) f[x]=0;if (du[x]==2) f[x]=1;if (du[x]> 2) {int mx=-1,pos=-1,mx2=-1;for (int i=head[x]; i; i=nxt[i]) {int j=to[i];if (f[j]>mx&&j!=fa[x]) mx=f[j],pos=j;}for (int i=head[x]; i; i=nxt[i]) {int j=to[i];if (f[j]>mx2&&j!=pos&&j!=fa[x]) mx2=f[j];}f[x]=mx2+du[x]-2+1;}
}
int sta[N],top=0,sum[N];
inline bool check(int mid) {int tmp=0;for (int p=1; p<top; p++) {int x=sta[p],cnt=0;for (int i=head[x]; i; i=nxt[i]) {int j=to[i];if (j!=sta[p+1]&&j!=sta[p-1]&&sum[p]+f[j]+1-(p!=1)>mid-tmp) cnt++;  }tmp+=cnt;if (tmp>mid||tmp>p) return 0;}return 1;
}
int main() {freopen("angrybirds.in","r",stdin);freopen("angrybirds.out","w",stdout);n=read(),t=read(),s=read();for (int i=1; i<n; i++) {int x=read(),y=read();link(x,y),link(y,x),du[x]++,du[y]++;}dfs(t);for (int i=s; i!=t; i=fa[i]) sta[++top]=i;sta[++top]=t;for (int i=top-1; i; i--) sum[i]=sum[i+1]+du[sta[i]]-1-(sta[i]!=t);int l=0,r=n;while (l<r) {int mid=l+r>>1;if (check(mid)) r=mid; else l=mid+1;}cout << l << endl;
}

CEOI2017 D1T3 mousetrap 树形dp+二分答案相关推荐

  1. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  2. poj 3208 Apocalypse Someday 数位dp+二分答案

    Apocalypse Someday Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 2203   Accepted: 11 ...

  3. HDU3585 Information Disturbing 树形dp+二分

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意 : 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能 ...

  4. D. Serval and Rooted Tree(思维+树形dp+二分辅助)

    https://codeforces.com/problemset/problem/1153/D 思路:参考issue https://issue-is-vegetable.blog.csdn.net ...

  5. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Jav ...

  6. P3994 高速公路 树形DP+斜率优化+二分

    $ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...

  7. LibreOJ #2478.「九省联考 2018」林克卡特树 树形dp+带权二分

    题意 给出一棵n个节点的树和k,边有边权,要求先从树中选k条边,然后把这k条边删掉,再加入k条边权为0的边,满足操作完后的图仍然是一棵树.问新树的带权直径最大是多少. n,k≤3∗105n,k≤3∗1 ...

  8. P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)

    [八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...

  9. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)

    P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...

  10. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

最新文章

  1. Android调用远程Service的参数和返回值都需要实现Parcelable接口
  2. 易生信群体和单细胞转录组专题第6期于5月10日在北京开课了
  3. SCIP习题 1.21(寻找最小因子)
  4. CSS父级子级学习总结
  5. Java Review - 并发编程_ConcurrentLinkedQueue原理源码剖析
  6. 解决了无法显示验证码的问题
  7. Intel RealSense D435摄像头被识别成D430的解决办法
  8. oracle移动表所在的表空间,ORACLE移动表空间(原)
  9. 第一百二十五期:程序员的自我救赎,使用Python开发性格分析工具
  10. vscode设置折行字数
  11. Magento: 单产品(product)或者当前类别(category)最大和最小价格 Min/Max Product Price in a Category...
  12. jq fileupload 设置最大文件大小5m_我猜你并不会设置“分辨率”
  13. make_smbcodepage - 为Samba创建代码页文件
  14. python中文文本处理_python简单文本处理的方法
  15. BitHacks--位操作技巧
  16. 54. yii 动作参数绑定
  17. kitti数据集坐标转换
  18. asterisk注册河南联通ims
  19. python怎样查找收盘价_如何在Python中从晨星获得调整后的收盘价?
  20. 蚊虫叮咬后的去痒妙方大全

热门文章

  1. 第一篇博客--随便聊聊
  2. Nginx网络压缩 CSS压缩 图片压缩 JSON压缩
  3. 广州华龙展贸考场——科目三
  4. 2019Windows7 虚拟机安装系统图文教程
  5. 不同云服务商之间域名转出转入(阿里云 转出至 腾讯云)
  6. 女暴徒BeHype:MINT和Raffle抽奖规则及答疑
  7. 【ArcGIS风暴】ArcGIS支持的栅格数据格式大全及格式转换案例精解
  8. python电化学cv曲线怎么画_cv曲线(电化学cv曲线分析)
  9. 小米6怎么刷入鸿蒙,小米6成功刷入统信UOS系统 刷机包开放下载
  10. 算加权成绩(MATLAB)