题外话:

这是制杖yd的交流题目

题面

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

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

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

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

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1000005;
 6 int p[N],noww[2*N],goal[2*N],path[N],deg[N];
 7 int intr[N],road[N],tort[N],far[N],dep[N];
 8 //intr(into-tree):进入这个点的子树又回来的最小次数
 9 //road:这个点到根路径上的岔路的数目
10 //tort(to-root):这个点到根的最小操作次数
11 int n,m,l,r,t1,t2,trp,rat,cnt,mid,ans,ops;
12 void Link(int f,int t)
13 {
14     noww[++cnt]=p[f],p[f]=cnt;
15     goal[cnt]=t,deg[t]++;
16 }
17 void DFS(int nde,int fth,int dth)
18 {
19     int max1=0,max2=0,tmp=-1;
20     far[nde]=fth,dep[nde]=dth;
21     for(int i=p[nde];i;i=noww[i])
22         if(goal[i]!=fth)
23         {
24             DFS(goal[i],nde,dth+1),tmp=intr[goal[i]];
25             if(tmp>=max1) max2=max1,max1=intr[goal[i]];
26             else if(tmp>max2) max2=tmp;
27         }
28     if(~tmp) intr[nde]=max2+deg[nde]-1;//次小值更新intr,叶子节点的是0
29     if(nde==rat)
30     {
31         while(far[nde])
32             path[++m]=nde,nde=far[nde];//把耗子初始位置到根的链拎出来
33         for(int i=m,lst=0;i;i--,lst=nde)
34             nde=path[i],road[nde]=road[lst]+deg[nde]-2;//扫一遍把岔路数量求出来
35     }
36 }
37 bool check(int x)
38 {
39     int lst=0;
40     for(int i=1;i<=m;i++)
41     {
42         int nde=path[i],tmp=0;
43         for(int j=p[nde];j;j=noww[j])
44             if(goal[j]!=far[nde]&&goal[j]!=lst)
45                 tmp+=(road[nde]+intr[goal[j]]+(i==1)>x);
46                 //这里+(i==1)是说初始这个点往下走的一步也需要擦掉,而它上面的点因为耗子走上来的时候已经把那条边给堵住了就不用擦了
47         x-=tmp,ops+=tmp,lst=nde;
48         if(x<0||ops>dep[rat]-dep[nde]+1) return false;//注意透支次数也是不行的
49     }
50     return true;
51 }
52 int main()
53 {
54     scanf("%d%d%d",&n,&trp,&rat);
55     for(int i=1;i<n;i++)
56     {
57         scanf("%d%d",&t1,&t2);
58         Link(t1,t2),Link(t2,t1);
59     }
60     DFS(trp,0,1),l=0,r=1000000;
61     while(l<=r)
62     {
63         mid=(l+r)/2,ops=0;
64         if(check(mid)) r=mid-1,ans=mid;
65         else l=mid+1;
66     }
67     printf("%d",ans);
68     return 0;
69 }

View Code

转载于:https://www.cnblogs.com/ydnhaha/p/10193484.html

解题:CEOI 2017 Mousetrap相关推荐

  1. 解题报告——2017年C/C++ A组第五题 字母组串(递归)

    题目描述: 由 A,B,C 这3个字母就可以组成许多串. 比如:"A","AB","ABC","ABA","A ...

  2. 解题:2017清华集训 无限之环

    题面 费用流 把每种水管再拆出来四个方向的接头,然后根据水管的形状连出旋转时的代价.最后黑白染色成二分图,然后白点对应的接头向黑点对应的接头连边,源点向白点自己连边,黑点自己向汇点连边. 怎么连边?我 ...

  3. [dfs树]「CEOI 2017」One-Way Streets

    不难的题.首先任意环上的边一定不是必经边,答案为B.我们随便搞一颗原图的dfs树,那么非树边,和每条飞树边覆盖的树上的链都是B.在树上打链覆盖的标记即可. 然后是对于每个x到y有路的限制,我们直接在x ...

  4. ceoi 2017 One-Way Streets

    题目描述 Once upon a time there was a country with n cities and m bidirectional roads connecting them. T ...

  5. 练习-CTF解题 - XMAN比赛 8-8-babyweb(netspark扫扫)

    http://202.112.51.217:8199/uploads/ 说说这题:练习-CTF解题 -OpenCTF 2017 - jsjs 直接用bp截获报文得到flag 说说这题:练习-CTF解题 ...

  6. 计算机开放电子书归档 2018

    97 Things Every Programmer Should Know Gitee 下载 Github 下载 SourceForge 下载 A Java Reference (UCB CS61b ...

  7. 【DTOJ】2701:问候

    DTOJ 2701:问候  解题报告 2017.11.08 第一版 --由翱翔的逗比w原创,引用yzl_rex的CSDN博客 题目信息: 题目描述 问候人类! 输入 输入一行,一个名字,如human( ...

  8. 计算机开放电子书归档 2018 1

    97 Things Every Programmer Should Know Gitee 下载 Github 下载 SourceForge 下载 A Java Reference (UCB CS61b ...

  9. 高中数学必修二平面解析几何之两直线的位置关系(归纳与整理)

    高中数学必修二平面解析几何重点介绍两直线的位置关系基础知识和易误点,并用平面解析几何两直线3个经典习题和2017年高考试题归纳与整理. 一. 基础知识 1. 两直线的平行.垂直与其斜率的关系 2.两条 ...

  10. python简明教程word版-计算机开放电子书归档 2018

    97 Things Every Programmer Should Know A Java Reference (UCB CS61b Textbook) AI Cheat Sheet Advanced ...

最新文章

  1. Java设计模式:单例模式
  2. java生成sql语句_java生成SQL语句
  3. Lync Server 2010迁移至Lync Server 2013故障排错Part1:缺少McsStandalone.msi
  4. 浏览器窗口控制---使用localStorage
  5. 浙江省高校计算机等级考试三级考什么容易,浙江省高校计算机等级考试大纲(三级)(3)...
  6. 彩虹云任务极致精简版--PHPcron程序
  7. Nachos 用户进程地址分配
  8. python 生成 exe
  9. phpstudy 403 forbidden
  10. JS获取本机IP的工具类
  11. JeecgBoot 框架中实现路由跳转页面,其他页面接收参数等使用方法
  12. 基于matlab的电机故障诊断,基于BP神经网络的电机故障诊断的研究(MATLAB,程序)
  13. Graphviz 双向边和无向边
  14. 油气勘探开发从业务到IT的一体化解决方案(全文)
  15. 存储过程语法(MySQL)
  16. x波段微带带通hairpin滤波器的历史
  17. 亚马逊、速卖通、Lazada、eBay、自养号测评成本需要多少?
  18. vulnhub DC1 靶场练习
  19. Windows XP操作系统自动关机的实现
  20. android-ndk-opencv-奥比中光深度摄像头(彩色)

热门文章

  1. 互联网热门词汇搞笑来袭
  2. 《我的二本学生》的读后感5000字范文
  3. 一文盘点中国商业航天:民营火箭的两类瓶颈和三大趋势
  4. for update加锁
  5. Python爬虫实战 | (10) 爬取猫眼电影《海王》影评并存入MySql数据库
  6. python桌面程序自动化教程_桌面应用自动化python
  7. 计算机usb接口电压不稳定,如何处理笔记本电脑USB接口的电源不足或电压不稳定?...
  8. 【云原生】Kubernetes编排工具精讲
  9. 1022-郑煤三板、锰硅、硅铁、纯碱跌停
  10. app邀请分享免填邀请码解决方案-邀请机制的要点、形式