题外话:

这是制杖yd的交流题目

题面

首先把捕鼠夹所在的点提出来当根,然后这变成了一棵有根树,我们先来看耗子移动的影响

可以发现耗子往下走就回不来了,而且最后还会被困在一个叶子上,那么这个时候我们把那个子树到根的路径砍成一条链(显然不砍成链耗子可以半路跑进岔路里,至少要你再清理一次,肯定不如砍了优)再把耗子放出来就可以了。而耗子往上走我们是管不了的(指不能阻止它往上走,但是可以砍旁边的分叉,一会具体说),毕竟我们不能把树砍断了,那耗子就到不了夹子了

那么耗子的决策就明确了,它往上走一段之后或者直接找到一个子树钻进去,这个子树应该是我们把子树的根到树的根砍成链需要操作次数最多的,而我们和耗子的博弈就是尽量阻止它钻进需要次数多的子树里。现在考虑求耗子钻进一个点的子树之后我们的最少操作数:先定义$intr[i]$表示耗子钻进$i$我们砍完边再把它放回$i$所需的最小次数,这样方便转移,转移的话因为我们每次只能砍一条边,就是一个点儿子里$intr$的不严格次大值(最大值被我们砍了,如果没有次大值就是零)加上这个点的度数(这个点也需要砍光)再减$1$(这个点和父亲之间的边)。

注意这时的状态还不是到根的答案,要求到根的答案我们还要处理一个$road[i]$表示从$i$到根路径上的岔路。这里我们把耗子所在的初始点到根的链拎出来,然后扫一遍就可以求出来$road$,这样每个点到根的时间就是$intr[i]+road[fa[i]]+(fa[i]==start)$,$+(fa[i]==start)$是因为初始这个点往下走的那条边也要擦一次 。然后我们发现直接求并不好求,因为并不容易知道耗子到底要怎么跑,但是我们可以二分一个答案,然后检验耗子能不能跑进一个超过当前时间的子树即可

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int p[N],noww[*N],goal[*N],path[N],deg[N];
int intr[N],road[N],tort[N],far[N],dep[N];
//intr(into-tree):进入这个点的子树又回来的最小次数
//road:这个点到根路径上的岔路的数目
//tort(to-root):这个点到根的最小操作次数
int n,m,l,r,t1,t2,trp,rat,cnt,mid,ans,ops;
void Link(int f,int t)
{
noww[++cnt]=p[f],p[f]=cnt;
goal[cnt]=t,deg[t]++;
}
void DFS(int nde,int fth,int dth)
{
int max1=,max2=,tmp=-;
far[nde]=fth,dep[nde]=dth;
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth)
{
DFS(goal[i],nde,dth+),tmp=intr[goal[i]];
if(tmp>=max1) max2=max1,max1=intr[goal[i]];
else if(tmp>max2) max2=tmp;
}
if(~tmp) intr[nde]=max2+deg[nde]-;//次小值更新intr,叶子节点的是0
if(nde==rat)
{
while(far[nde])
path[++m]=nde,nde=far[nde];//把耗子初始位置到根的链拎出来
for(int i=m,lst=;i;i--,lst=nde)
nde=path[i],road[nde]=road[lst]+deg[nde]-;//扫一遍把岔路数量求出来
}
}
bool check(int x)
{
int lst=;
for(int i=;i<=m;i++)
{
int nde=path[i],tmp=;
for(int j=p[nde];j;j=noww[j])
if(goal[j]!=far[nde]&&goal[j]!=lst)
tmp+=(road[nde]+intr[goal[j]]+(i==)>x);
//这里+(i==1)是说初始这个点往下走的一步也需要擦掉,而它上面的点因为耗子走上来的时候已经把那条边给堵住了就不用擦了
x-=tmp,ops+=tmp,lst=nde;
if(x<||ops>dep[rat]-dep[nde]+) return false;//注意透支次数也是不行的
}
return true;
}
int main()
{
scanf("%d%d%d",&n,&trp,&rat);
for(int i=;i<n;i++)
{
scanf("%d%d",&t1,&t2);
Link(t1,t2),Link(t2,t1);
}
DFS(trp,,),l=,r=;
while(l<=r)
{
mid=(l+r)/,ops=;
if(check(mid)) r=mid-,ans=mid;
else l=mid+;
}
printf("%d",ans);
return ;
}

解题:CEOI 2017 Mousetrap的更多相关文章

  1. Solution -「CEOI 2017」「洛谷 P4654」Mousetrap

    \(\mathscr{Description}\)   Link.   在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...

  2. 2019.3.16 noiac的原题模拟赛

    RT,这太谔谔了,我不承认这是模拟赛 但是虽然是搬了三道题,题目本身也还能看,就这么着吧 (怎么机房里就我一道原题都没做过啊 T1 CF24D Broken Robot 比较简单地列出式子之后,我们发 ...

  3. 【DTOJ】2704:数字互换

    DTOJ 2704:数字互换  解题报告 2017.11.11 第一版 ——由翱翔的逗比w原创 题目信息: 题目描述 输入两个数作为交换数,输出已交换顺序后的两个值. 输入 两个整数,空格隔开 输出 ...

  4. 【DTOJ】2703:两个数的余数和商

    DTOJ 2703:两个数的余数和商  解题报告 2017.11.10 第一版 ——由翱翔的逗比w原创,引用<C++ Primer Plus(第6版)中文版> 题目信息: 题目描述 给你a ...

  5. 【DTOJ】1001:长方形周长和面积

    DTOJ 1001:长方形周长和面积  解题报告 2017.11.05 第一版  ——由翱翔的逗比w原创 题目信息: 题目描述 已知长方形的长和宽,求长方形的周长和面积? 输入 一行:空格隔开的两个整 ...

  6. 计算机电子书 2018 BiliDrive 备份

    下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 Webpack 中文指南.epub (40 ...

  7. 2017.11.11 B201 练习题思路及解题方法

    2017.11.11 B201 练习题思路及解题方法 题目类型及涵盖知识点 本次总共有6道题目,都属于MISC分类的题目,涵盖的知识点有 信息隐藏 暴力破解 音轨,摩斯电码 gif修改,base64原 ...

  8. ACM-ICPC 2017 Asia HongKong 解题报告

    ACM-ICPC 2017 Asia HongKong 解题报告 任意门:https://nanti.jisuanke.com/?kw=ACM-ICPC%202017%20Asia%20HongKon ...

  9. 2017年第六届数学中国数学建模国际赛(小美赛)C题解题思路

    这篇文章主要是介绍下C题的解题思路,首先我们对这道C题进行一个整体的概括,结构如下: C题:经济类 第一问:发现危险人群. 发现:欺诈的方式开始.雇佣或浪漫的承诺. 数据→确定特定的经济萧条地区→确定 ...

随机推荐

  1. Netty源码分析第5章(ByteBuf)---->第3节: 缓冲区分配器

    Netty源码分析第五章: ByteBuf 第三节: 缓冲区分配器 缓冲区分配器, 顾明思议就是分配缓冲区的工具, 在netty中, 缓冲区分配器的顶级抽象是接口ByteBufAllocator, 里 ...

  2. 基于Python的信用评分卡模型分析(一)

    信用风险计量体系包括主体评级模型和债项评级两部分.主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡.B卡.C卡和F卡:债项评级模型通常按照主体的融资用途,分为 ...

  3. pytorch 如何使用tensorboard实时查看曲线---- tensorboardX简介

    用惯了tensorflow的小伙伴肯定都用过tensorboard工具吧.虽然Facebook也推出了visdom,但是在一次不小心误触clear之后,我放弃了这个工具(页面的一个clear按钮我本来 ...

  4. Paxos共识算法

    Paxos共识算法 paxos是一族用来解决分布式系统共识的基础算法,共识过程就是在一组节点上达成一个一致的结果.由于节点可能会错误,通讯消息也可能会丢失,所以建立共识是一个比较复杂的过程. paxo ...

  5. OGG 跳过事务(转)

    http://blog.chinaunix.net/uid-26190993-id-3434074.html    在OGG运行过程中,通常会因为各种各样的原因导致容灾端的REPLICAT进程ABEN ...

  6. webpack入门指南-step04

    一.建立项目 建一个文件夹,然后新建一个package.json的文件在项目根目录下 如果你使用git管理你的这个项目的话,建议你新建一个.gitignore文件,不要让git提交一些node依赖的模 ...

  7. Daily Scrum 11.15

    今日完成任务: 1.在回答页面显示用户的相关信息 2.重写了搜索方法,并在自己的Demo网站测试成功 3.修改问题实体属性,加入悬赏积分:并在问题列表页面显示问题悬赏分数 遇到困难:一个是对于学长的搜 ...

  8. Daily Scrum9 11.13

    昨天的任务已完成. 今日任务: 姓名 今日任务 时长 徐钧鸿 测试SQL包里的代码 2h 张艺 继续搭建还没搭建完的框架 修复bug 2h 黄可嵩 继续进行搜索响应编写 2h 徐方宇 搭建框架 修改b ...

  9. MathExam6317

    自己取一个大气又可爱的标题 小学二年级的还没来得及写,大部分时间还是花在巩固和查阅新旧知识上了,通过看学习视频,查资料,看博客园的博客...下次完善好了交上. 一.预估与实际 PSP2.1 Perso ...

  10. BNUOJ 52308 We don't wanna work! set模拟

    题目链接: https://acm.bnu.edu.cn/v3/problem_show.php?pid=52308 We don't wanna work! Time Limit: 60000msM ...