题目描述

有一个有 nnn 个房间和 n−1n-1n−1 条走廊的迷宫,保证任意两个房间可以通过走廊互相到达,换句话说,这个迷宫的结构是一棵树。

一个老鼠被放进了迷宫,迷宫的管理者决定和老鼠做个游戏。

一开始,有一个房间被放置了陷阱,老鼠出现在另一个房间。老鼠可以通过走廊到达别的房间,但是会弄脏它经过的走廊。老鼠不愿意通过脏的走廊。

每个时刻,管理者可以进行一次操作:堵住一条走廊使得老鼠不能通过,或者擦干净一条走廊使得老鼠可以通过。然后老鼠会通过一条干净的并且没被堵住的走廊到达另一个房间。只有在没有这样的走廊的情况下,老鼠才不会动。一开始所有走廊都是干净的。管理者不能疏通已经被堵住的走廊。

现在管理者希望通过尽量少的操作将老鼠赶到有陷阱的房间,而老鼠则希望管理者的操作数尽量多。请计算双方都采取最优策略的情况下管理者需要的操作数量。

注意:管理者可以选择在一些时刻不操作。

输入输出格式

输入格式:

第一行三个空格隔开的正整数数 n,t,mn,t,m。分别代表房间的个数,陷阱房的编号和老鼠起始房间的编号。

接下来 n−1n-1n−1 行,每行两个空格隔开的整数 ai,bia_i,b_iai​,bi​ ​​,表示有一条走廊连接编号为 aia_iai​​ 和 bib_ibi​​​ 的房间。

输出格式:

输出一行包含一个整数,表示双方都采取最优策略的情况下,管理者需要的操作数量。

思路

本来做Chase的时候就有把CEOI2017做完的想法,结果咕咕了。然后考试又考了一道,QwQ。痛下决心一定要做完。

题目较难, 题解就贴这位巨佬的。

想了很久。我的想法跟这个老哥很像,但我一开始觉得老鼠向上爬只会去fff值最大的子树,就直接把答案算成该子树的fff值。然后,LOJ的数据60+。

反例就是,管理者再上方封路后,老鼠走次小子树(吗)。

代码

#include<cstdio>
#include<string>
#define R_ register
inline int read() {int ret=0,f=1,ch=getchar();for (; !isdigit(ch); ch=getchar()) if (ch=='-') f=-f;for (; isdigit(ch); ch=getchar()) ret=ret*10+ch-48;return ret*f;
}
const int maxn=2e6+5;
int tot,top,son[maxn],nxt[maxn],lnk[maxn],rod[maxn];
int N,T,S,Ans,f[maxn],fa[maxn],deg[maxn],sum[maxn],vis[maxn];
inline void add_edge(int x,int y) {son[++tot]=y,nxt[tot]=lnk[x],lnk[x]=tot,++deg[x];son[++tot]=x,nxt[tot]=lnk[y],lnk[y]=tot,++deg[y];
}
void Build(int x,int pre=0) {R_ int k=lnk[x],v,Max1=0,Max2=0;for (; v=son[k],k; k=nxt[k]) if (v^pre)if (fa[v]=x,Build(v,x),f[v]>=Max1) Max2=Max1,Max1=f[v];else if (f[v]>Max2) Max2=f[v];f[x]=Max2+deg[x]-1;
}
inline bool check(int res) {int cnt=0,tmp;for (R_ int i=1,k,v; i<=top; ++i) {for (tmp=0,k=lnk[rod[i]]; v=son[k]; k=nxt[k])if (v^rod[i+1]&&v^rod[i-1]&&sum[i]+f[v]+1-(i!=1)>res) ++tmp;cnt+=tmp,res-=tmp;if (res<0||cnt>i) return 0;}return 1;
}
int main() {#ifndef ONLINE_JUDGEfreopen("trap.in","r",stdin);freopen("trap.out","w",stdout);
#endifR_ int i,L=0,R=1e8,mid;for (N=read(),T=read(),S=read(),i=1; i<N; ++i) add_edge(read(),read());for (Build(T),f[T]=0,i=S; i; i=fa[i]) rod[++top]=i;for (i=top-1; i; i--) sum[i]=sum[i+1]+deg[rod[i]]-2;for (; L<=R; ) check(mid=L+R>>1)?Ans=mid,R=mid-1:L=mid+1;return printf("%d\n",Ans),0;
}

CEOI2017 Mousetrap相关推荐

  1. 【LOJ】【树形DP】2485 「CEOI2017」Chase

    LOJ 2485 「CEOI2017」Chase 题目大意 ◇题目传送门◆ 似乎压缩起来有点困难,所以就不压缩了吧 QwQ- 分析 考虑扔一个磁铁能够产生的让逃亡者和追逐者之间的差异. 这个差异就是这 ...

  2. 【动态规划】loj#2485. 「CEOI2017」Chase

    有意思的可做dp题:细节有点多,值得多想想 题目描述 在逃亡者的面前有一个迷宫,这个迷宫由 nnn 个房间和 n−1n-1n−1 条双向走廊构成,每条走廊会链接不同的两个房间,所有的房间都可以通过走廊 ...

  3. 【CEOI2017】Building Bridges【任意坐标斜率优化】【李超线段树】

    题意:有 nnn 个柱子,每个柱子有高度 hih_ihi​.你需要在柱子间修桥,在 i,ji,ji,j 间修桥代价为 (hi−hj)2(h_i-h_j)^2(hi​−hj​)2,桥梁只能在柱子处相交, ...

  4. @loj - 2483@「CEOI2017」Building Bridges

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 有 n 根柱子依次排列,第 i 根柱子的高度为 hi .现可以花费 ...

  5. [CEOI2017]One-Way Streets

    题解 这种题的解法其实我觉得很多都是随便弄一个生成树,然后再生成树上面加边,然后乱搞.. 这题也是一样,你先随便弄一个生成树 然后你你每次加一条边,如果出现了环,那么这上面所有的边就都是B了 然后我们 ...

  6. 【洛谷4657】[CEOI2017] Chase(一个玄学的树形DP)

    点此看题面 大致题意: 有一棵树,树上编号为 i i i的节点上有 F i F_i Fi​个铁球,逃亡者有 V V V个磁铁,当他在某个节点放下磁铁时,与这个节点相邻的所有节点上的铁球都会被吸引到这个 ...

  7. 【树形DP】CEOI2017 Chase

    分析: 不算难的树形DP套路题. 首先,分析这个答案:可以视为,在一条路径上,选择了一些点,这些点的贡献为: 其周围的所有点权和 - 路径上一步的点权. 既然给出的是一颗树,所以可以把路径分为从下往上 ...

  8. 【题解】LuoGu4657:[CEOI2017]Chase

    原题传送门 扔磁铁得到的收益有两种情况 我在起点,扔一个磁铁,周围的权值是收益,因为周围的那些铁块我肯定不会遇到,而追逐者肯定会遇到 我从某一个点走过来,假设上一个点是红点,现在我在绿点,然后我扔了一 ...

  9. scrum项目管理_Scrum,用于初创企业(或针对该项目的任何项目)

    scrum项目管理 Scrum is a lightweight framework designed to help small, close-knit teams of people develo ...

  10. 前端开发需要了解的JS插件

    excanvas.js/Chart.js/cubism.js/d3.js/dc.js/dx.chartjs.js/echarts.js/flot.js 用途:构建数据统计图表,兼容多浏览器 jquer ...

最新文章

  1. python画轨迹曲线-python 画3维轨迹图并进行比较的实例
  2. 你眼中的OA行业发展前景
  3. java error与exception_Java中Error与Exception的区别
  4. SQL SERVER怎么去掉重复数据?
  5. 链表(单链表、双链表、内核链表)
  6. 从Spring Boot信息泄露到AWS控制台劫持(攻破aws亚马逊服务器)
  7. html手册_HTML手册
  8. python京东预约抢购流程_[Python] 京东秒杀商品抢购-茅台抢购自动获取抢购时间【修改】...
  9. 洛谷入门题 深基2 例5~例8
  10. Perl中shift函数用法
  11. Unspeakable joy : rejoicing in early modern England【翻译】
  12. 微信公众号后台添加安全域名 提示:无法访问xxx指向的web服务器(或虚拟主机)的目录,请检查网络设置
  13. #35-【刷题】乐乐的方块
  14. Android 多国家语言适配
  15. ESP32学习笔记(45)——DAC接口使用
  16. 如何判断两个地址是否在同一网段
  17. 解除外链屏蔽,对互联网行业意味着什么?
  18. 扇贝上的python靠谱吗_我终于找到了扇贝的秘密
  19. IBM中高端阵列增加STEC MLC固态硬盘支持
  20. adb shell monkey

热门文章

  1. Apache Ignite
  2. openpyxl 添加分页符
  3. c语言求余的方法,c语言求余的实现方法_后端开发
  4. win10激活方法(无需下载)
  5. HDU-6437 Problem L.Videos(最大费用最大流拆点)
  6. 无人机飞行控制逻辑以及不稳定原因分析
  7. 虚拟服务器需要备案吗,虚拟主机需要备案吗
  8. 服务器网络连接显示100m,本地连接速度是1G200M的宽带为什么只有100M网速
  9. 显示搜索dota2协调服务器,搜索dota2游戏协调服务器中【操作方式】
  10. 金融业大数据应用场景