[CEOI2017]Mousetrap
博弈论既视感
身临其境感受耗子和管理的心理历程。
以陷阱为根考虑。就要把耗子赶到根部。
首先一定有解。
作为耗子,为了拖延时间,必然会找到一个子树往下走。
如果耗子从子树往下走的话,
那么一定会走到一个叶子被自己卡住。
作为管理,堵路比清理容易的多。否则耗子进去了还得清理把它轰出来。
所以,耗子进入一个子树,管理先手,必定堵住花费最大的子树,耗子会到次大的子树
然后耗子还要赶回来,赶回来之前,一定先把沿途其他的路堵住,再放耗子回来
所以树形dp
in[x]表示,耗子从以x为根的子树往下走,再回到x共花费的次数
in[x]=cmx(in[y])+du[x]-2+1
cmx表示次大值。度数这一层要堵住的其他路,+1是走下去的这个边还要清理。
耗子回来了,怎么办?
耗子往上走,找机会还会往下。所以综合考虑,不如在耗子困进子树叶子里之后,先把到root的链上所有其他分支堵住,然后再放耗子出来,一定就进了陷阱
cos[x]=in[x]+沿途度数和
但是耗子不一定往下走。可能一开始往上走,再往下走
不好处理,不如二分
沿着链往上走,记录还能行动的次数,以及可以多k次先手(先手有用,省着先不做)
如果一个点管理员瞎玩去了没有干啥,耗子进入最大子树,这样花费已经固定。
考虑花费是否大于剩余的步数
否则用一次先手机会,然后花费一次行动堵住。
如果行动不够,或者先手不够,那么GG
注意堵儿子的时候,之前堵上的就不用再堵了,所以记录tmp为堵住的叶子个数。
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e6+;
const int inf=0x3f3f3f3f;
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
int du[N];
int n,t,m;
int in[N],cos[N],dep[N];
int fa[N];
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
bool cmp(int x,int y){
return cos[x]>cos[y];
}
void dfs(int x,int d,int c){
dep[x]=d;
int cmx=,mx=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa[x]) continue;
fa[y]=x;
if(x!=t) dfs(y,d+,c+du[x]-);
else dfs(y,d+,c);
if(in[y]>mx){
cmx=mx;mx=in[y];
}else{
cmx=max(cmx,in[y]);
}
}
in[x]=cmx++du[x]-;
cos[x]=in[x]+c+(fa[x]==m);
}
bool che(int mid){//root is t ; start is m
//cout<<" mid "<<mid<<endl;
int re=mid;
int k=;
int now=m;
// if(ch[now].size()){
// if(cos[ch[now][0]]>=re) --re;
// else ++k;
// }
// if(re<0) return false;
// if(k<0) return false;
//cout<<" midmid "<<mid<<" : "<<re<<endl;
int las=;
//now=fa[now];
while(now!=t){
++k;
int tmp=;
for(reg i=hd[now];i;i=e[i].nxt){
int y=e[i].to;
if(y==las||y==fa[now]) continue;
if(cos[y]-tmp>re){
--k;--re;
++tmp;
}
if(re<) return false;
if(k<) return false;
}
las=now;
now=fa[now];
}
return true;
}
int main(){
rd(n);rd(t);rd(m);
if(m==t){
puts("");return ;
}
int x,y;
for(reg i=;i<n;++i){
rd(x);rd(y);
++du[x];++du[y];
add(x,y);add(y,x);
}
dfs(t,,);
// for(reg i=1;i<=n;++i){
// cout<<" ii "<<i<<" : "<<in[i]<<" "<<cos[i]<<endl;
// }
int L=,R=n+;
L=cos[m];
int ans=;
while(L<=R){
int mid=(L+R)>>;
if(che(mid)){
ans=mid;
R=mid-;
}else{
L=mid+;
}
}
printf("%d",ans);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2018/12/29 10:05:21
*/ /*
Author: *Miracle*
Date: 2018/12/29 10:05:21
*/
总结:
挺不错的小游戏
还是考虑每个角色的策略吧。
有一些分析和直觉猜测。
[CEOI2017]Mousetrap的更多相关文章
- LOJ2482 CEOI2017 Mousetrap 二分答案、树形DP
传送门 表示想不到二分答案qwq 将树看作以陷阱为根.先考虑陷阱和起始点相邻的情况,此时老鼠一定会往下走,而如果管理者此时不做操作,那么一定会选择让操作次数变得最大的一棵子树.设\(f_i\)表示当前 ...
- luogu P4654 [CEOI2017]Mousetrap
传送门 这里把终点设为根方便后续处理,那么目标就是要让老鼠走到根 首先考虑老鼠动不了的情况,这种情况下可以把从这个点到终点路径上的分支堵住,然后再疏通路径上的走过的边,可以发现这是这种情况下最优的决策 ...
- Mousetrap - Keyboard shortcuts in Javascript
Mousetrap is a simple library for handling keyboard shortcuts in Javascript. It is around 2kb minifi ...
- Luogu4655 [CEOI2017]Building Bridges
Luogu4655 [CEOI2017]Building Bridges 有 \(n\) 根柱子依次排列,每根柱子都有一个高度.第 \(i\) 根柱子的高度为 \(h_i\) . 现在想要建造若干座桥 ...
- loj#2483. 「CEOI2017」Building Bridges 斜率优化 cdq分治
loj#2483. 「CEOI2017」Building Bridges 链接 https://loj.ac/problem/2483 思路 \[f[i]=f[j]+(h[i]-h[j])^2+(su ...
- [CEOI2017]Palindromic Partitions
[CEOI2017]Palindromic Partitions 题目大意: 给出一个长度为\(n(n\le10^6)\)的只包含小写字母字符串,要求你将它划分成尽可能多的小块,使得这些小块构成回文串 ...
- [原创]Javascript 利用mousetrap.js进行键盘事件操作
我们日常开发中,会遇到js的键盘操作,例如回车提交表单之类的.或者按下某个键执行某个方法.无意中发现一个大小不到4K的js文件,它非常方便的操作键盘事件. 自己也尝试了一下:具体代码如下: 详情可以去 ...
- ceoi2017 Building Bridges(build)
Building Bridges(build) 题目描述 A wide river has nn pillars of possibly different heights standing out ...
- 题解-[CEOI2017]Building Bridges
[CEOI2017]Building Bridges 有 \(n\) 个桥墩,高 \(h_i\) 重 \(w_i\).连接 \(i\) 和 \(j\) 消耗代价 \((h_i-h_j)^2\),用不到 ...
随机推荐
- Windows运行机理——主程序—WinMain
Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 在windows 操作系统下,用C 或者C++来编写MS-DOS 应用 ...
- Spring全局变量
压测spring框架的webservice接口,大并发量下响应值与预期值不一致 经查,开发在类中使用全局变量导致: springmvc核心控制器DispatcherServlet 默认为每个contr ...
- stm32之SPI通信协议
SPI (Serial Peripheral interface),顾名思义就是串行外围设备接口.SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为P ...
- hive使用spark引擎的几种情况
使用spark引擎查询hive有以下几种方式:1>使用spark-sql(spark sql cli)2>使用spark-thrift提交查询sql3>使用hive on spark ...
- Laxcus大数据管理系统2.0(7)- 第五章 数据构建
第五章 数据构建 在数据处理过程,我们经常会遇到这样的情况:大多数时候,用户最初输入的数据会含有大量无意义的.杂乱的信息,需要经过提炼.收集.汇总等一系列手段,才能产生有意义和用户可识别的数据内容:当 ...
- 完全背包问题 :背包dp
题目描述: 有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用.第 i 种物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出最 ...
- 2018科大讯飞AI营销算法大赛全面来袭,等你来战!
AI技术已成为推动营销迭代的重要驱动力.AI营销高速发展的同时,积累了海量的广告数据和用户数据.如何有效应用这些数据,是大数据技术落地营销领域的关键,也是检测智能营销平台竞争力的标准. 讯飞AI营销云 ...
- leetcode个人题解——#24 Swap Nodes in Pairs
因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一 ...
- Saruman's Army(贪心)
Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep tra ...
- .net改善程序性能建议
对改善程序性能的建议. 文章:https://msdn.microsoft.com/zh-cn/library/ms973838.aspx