【AGC010F】Tree Game
Description
有一棵\(n\)个节点的树(\(n \le 3000\)),第\(i\)条边连接\(a_i,b_i\),每个节点\(i\)上有\(A_i\)个石子,高桥君和青木君将在树上玩游戏。
首先,高桥君会选一个节点并在上面放一个棋子,然后从高桥君开始,他们轮流执行以下操作:
(1)从当前棋子占据的点上移除一个石子;
(2)将棋子移动到相邻节点
如果轮到一个人执行操作时棋子占据的点上没有石子,那么他就输了 。
请你找出所有的点\(v\),使得如果高桥君在游戏开始时把棋子放到\(v\)上,他可以赢。(按编号从小到大输出)
Solution
首先两个人的行动是互相约束的。
假设当前在节点\(u\),先手能耗死后手(即先手必胜)当且仅当对于其所有相邻点,至少存在一个点\(v\),满足:
(1)\(a_u>a_v\)
(2)\(v\)先手必败。
首先(1)是这题对局的一种博弈过程,设想有且只有两个点\(u\)和\(v\),若初始时棋子在\(u\),且\(a_u>a_v\),那么反复走,后手必死。
因此只要先手走向了如是的\(v\),后手必定不会在这条边上反复横跳,之后也不会,因为一旦后手走回来,先手继续走回\(v\),可以把后手耗到死。
那么后手必定也只能在\(v\)中寻找机会。只要\(v\)是先手必败态,那么\(u\)即为先手必胜态,因为先手可以主动走到\(v\)引出必败态。
定义\(u\)是先手必败态当且仅当不存在上述\(v\)。
首先,如果先手走向的点\(v\)满足\(a_u\le a_v\),后手可以走回\(u\),因为反复横跳后先手必死。因此这些点不可走。
走向的点\(v\)满足\(a_u>a_v\)时,若\(v\)为先手必胜态,那么\(u\)肯定不能走这一步;如果不存在\(v\)是先手必败态,那么先手就无路可走了。
综上,因为必须走一步,所以\(u\)是先手必败态,当且仅当不存在\(v\)满足\(a_u>a_v\)且\(v\)先手必败。
对于每一个点,以其为根深搜,设\(f_u\)表示\(u\)是必胜还是必败,自底向上DP一遍。
为什么可以自底向上单向考虑?我们是要DP判定每个点\(u\)是不是必胜态,即要找到是否存在相邻点\(v\)满足\(a_u>a_v\),并深搜计算它们的必胜必败态。而对于不满足条件的\(v\),我们甚至不需要递归进去计算,因为先手不会选择走这边。所以,会选择\(u\)的父亲作为\(v\)吗?不会。每递归到\(u\)时,也就意味着,是上一步的先手想逼我(当前先手)反复横跳才走这一步过来,即满足\(a_{fa}>a_u\),所以当前先手肯定不能走父亲回去和他反复横跳。因此可以说,DP过程中,是一路向下,走后继递归计算的。
时间复杂度\(\mathcal O(n^2)\)。
我真TM可以退役了。
Code
#include <cstdio>
using namespace std;
const int N=3005;
int n,a[N],f[N];
int h[N],tot;
struct Edge{int v,next;}e[N*2];
inline void addEdge(int u,int v){
e[++tot]=(Edge){v,h[u]}; h[u]=tot;
e[++tot]=(Edge){u,h[v]}; h[v]=tot;
}
void readData(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
int u,v;
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
addEdge(u,v);
}
}
void dfs(int u,int fa){
f[u]=0;
for(int i=h[u],v;i;i=e[i].next)
if((v=e[i].v)!=fa&&a[u]>a[v]){
dfs(v,u);
if(f[v]==0){
f[u]=1;
return;
}
}
}
void solve(){
for(int u=1;u<=n;u++){
dfs(u,0);
if(f[u])
printf("%d ",u);
}
}
int main(){
readData();
solve();
return 0;
}
【AGC010F】Tree Game的更多相关文章
- 【AGC010F】Tree Game 博弈论+暴力
Description 有一棵nn个节点的树,第ii条边连接ai,biai,bi,每个节点ii上有AiAi个石子,高桥君和青木君将在树上玩游戏 首先,高桥君会选一个节点并在上面放一个棋子,然后 ...
- 【POJ3237】Tree 树链剖分+线段树
[POJ3237]Tree Description You are given a tree with N nodes. The tree's nodes are numbered 1 through ...
- 【BZOJ】【2631】Tree
LCT 又一道名字叫做Tree的题目…… 看到删边加边什么的……又是动态树问题……果断再次搬出LCT. 这题比起上道[3282]tree的难点在于需要像线段树维护区间那样,进行树上路径的权值修改&am ...
- 【Luogu1501】Tree(Link-Cut Tree)
[Luogu1501]Tree(Link-Cut Tree) 题面 洛谷 题解 \(LCT\)版子题 看到了顺手敲一下而已 注意一下,别乘爆了 #include<iostream> #in ...
- 【BZOJ3282】Tree (Link-Cut Tree)
[BZOJ3282]Tree (Link-Cut Tree) 题面 BZOJ权限题呀,良心luogu上有 题解 Link-Cut Tree班子提 最近因为NOIP考炸了 学科也炸了 时间显然没有 以后 ...
- 【AtCoder3611】Tree MST(点分治,最小生成树)
[AtCoder3611]Tree MST(点分治,最小生成树) 题面 AtCoder 洛谷 给定一棵\(n\)个节点的树,现有有一张完全图,两点\(x,y\)之间的边长为\(w[x]+w[y]+di ...
- 【HDU5909】Tree Cutting(FWT)
[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...
- 【BZOJ2654】Tree(凸优化,最小生成树)
[BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...
- 【POJ1741】Tree(点分治)
[POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...
随机推荐
- Unity新版本VR以及SteamVR基础
一.Unity2018新版本VR Unity 简单VRDemo搭建 Unity环境搭建: PlayerSetting设置如下: 启动虚拟现实驱动,sdk选择OpenVR.HTC Vive只支持Ope ...
- NO--19 微信小程序之scroll-view选项卡与跳转(二)
本篇为大家介绍为何我们在最后做交互的时候,并没有使用上一篇讲的选项卡的效果. scroll-view与跳转.gif (如无法查看图片,还请翻看上一篇!) 大家注意看,在我点击跳转后,首先能看到的是 ...
- php快速上手总结
PHP作为现代热门主流的开发语言,对于那些想加入新手PHPer,从哪学起,如何学习?你必须要需要掌握PHP的基础知识,基础知识相当于重点,是不可忽视的知识.常用的功能模块,面向对象的,MVC等相关技能 ...
- 006 --MySQL索引原理
一 .索引的概念? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化 ...
- yocto-sumo源码解析(十): ProcessServer.idle_commands
这一节开始介绍ProcessServer.idle_commands,前面我们知道ProcessServer.main就是不停调用idle_commands()以获取可用的套接字描述符或者是文件描述符 ...
- MyBatis思维导图
1.初识框架技术 2.搭建MyBatis环境 3.掌握MyBatis的核心API 4.掌握MyBatis的核心配置文件:主要用于配置数据库连接和MyBatis运行时所需的各种特性 5.掌握SQL映射文 ...
- 8.openldap mirrormode(主主同步)
作者:yaoyao #MirrorMode双主模式 1.主机: ldap01.liuyao.com ldap02.liuyao.com 2.搭建LDAP服务 搭建过程省略,保证2台服务器部署配置一样即 ...
- 马赛克是否无法逆转?Python简单消除,看片无忧!
图片水印,轻松去除 前段时间玩过了全民K歌,不知道大家是否玩过,还是做得挺好的,就我这嗓子都能唱出张学友的味道,其中更是有消除噪声的功能,就是朋友们都在吃鸡大叫,我在旁边唱歌依然不受影响. 既然声音可 ...
- 局域网传输-LED灯搭建局域网:数据传输可达每秒3Gb
一 : LED灯搭建局域网:数据传输可达每秒3Gb 我们之前介绍了利用可见光通讯技术,通过LED灯光实现精准室内定位的例子.实际上,这种灯泡和技术的用途不止于此,比如,它还能进行无线网络传输. 最近, ...
- 解决maven update project 后项目jdk变成1.5
http://blog.csdn.net/jay_1989/article/details/52687934