Description

Alice和Bob在玩游戏。有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最
小的点。Alice和Bob轮流操作,每回合选择一个没有被删除的节点x,将x及其所有祖先全部删除,不能操作的人输
。注:树的形态是在一开始就确定好的,删除节点不会影响剩余节点父亲和儿子的关系。比如:1-3-2 这样一条链
,1号点是根节点,删除1号点之后,3号点还是2号点的父节点。问有没有先手必胜策略。n约为10w。
显然只要算出每颗子树的sg值就可以计算答案了,考虑自底向上推出sg值,用trie维护当前子树中,删去一条从根开始的链后得到的每种情况的sg值(即为与这条链相邻的子树的sg值的异或和)构成的集合,于是可以查询mex,通过trie的合并可以构建出当前点的父亲对应的集合,另外要通过打标记实现整棵trie异或上一个值。
#include<cstdio>
#include<cstring>
#include<algorithm>
const int N=;
int T,n,m;
int es[N*],enx[N*],e0[N],ed[N],ep=,f[N];
int sz[N*],ch[N*][],xt[N*],rt[N],p=;
void tag(int w,int h,int v){
if(w&&h>=&&v){
xt[w]^=v;
if(v>>h&)std::swap(ch[w][],ch[w][]);
}
}
void dn(int w,int h){
if(xt[w]){
tag(ch[w][],h-,xt[w]);
tag(ch[w][],h-,xt[w]);
xt[w]=;
}
}
int mex(int w){
int s=;
for(int i=,d;~i;--i){
dn(w,i);
if(sz[ch[w][]]==(<<i))w=ch[w][],s|=<<i;
else w=ch[w][];
}
return s;
}
int build(int x){
int rt=++p,w;
sz[w=rt]=;
for(int i=;~i;--i)sz[w=ch[w][x>>i&]=++p]=;
return rt;
}
int merge(int a,int b,int h){
if(!a||!b)return a|b;
dn(a,h);dn(b,h);
ch[a][]=merge(ch[a][],ch[b][],h-);
ch[a][]=merge(ch[a][],ch[b][],h-);
sz[a]=h>=?sz[ch[a][]]+sz[ch[a][]]:;
return a;
}
void dfs(int w,int pa){
ed[w]=;
int x=;
for(int i=e0[w],u;i;i=enx[i]){
u=es[i];
if(u!=pa){
dfs(u,w);
x^=f[u];
}
}
for(int i=e0[w],u;i;i=enx[i]){
u=es[i];
if(u!=pa){
tag(rt[u],,x);
rt[w]=merge(rt[w],rt[u],);
}
}
rt[w]=merge(rt[w],build(x),);
f[w]=mex(rt[w]);
tag(rt[w],,f[w]);
}
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
int main(){
for(T=_();T;--T){
if(p){
memset(ch,,sizeof(ch[])*(p+));
memset(sz,,sizeof(int)*(p+));
memset(xt,,sizeof(int)*(p+));
p=;
}
n=_();m=_();
for(int i=;i<=n;++i)e0[i]=ed[i]=f[i]=rt[i]=;
ep=;
for(int i=,a,b,c;i<m;++i){
a=_();b=_();
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
for(int i=;i<=n;++i)if(!ed[i]){
dfs(i,);
f[]^=f[i];
}
puts(f[]?"Alice":"Bob");
}
return ;
}

bzoj4730: Alice和Bob又在玩游戏的更多相关文章

  1. [UOJ266]Alice和Bob又在玩游戏

    [UOJ266]Alice和Bob又在玩游戏 Tags:题解 作业部落 评论地址 TAG:博弈 题意 不同于树的删边游戏,删掉一个点删去的是到根的路径 题解 这题只和计算\(SG\)有关,博弈的有关内 ...

  2. UOJ #266 【清华集训2016】 Alice和Bob又在玩游戏

    题目链接:Alice和Bob又在玩游戏 这道题就是一个很显然的公平游戏. 首先\(O(n^2)\)的算法非常好写.暴力枚举每个后继计算\(mex\)即可.注意计算后继的时候可以直接从父亲转移过来,没必 ...

  3. uoj266[清华集训2016]Alice和Bob又在玩游戏(SG函数)

    uoj266[清华集训2016]Alice和Bob又在玩游戏(SG函数) uoj 题解时间 考虑如何求出每棵树(子树)的 $ SG $ . 众所周知一个状态的 $ SG $ 是其后继的 $ mex $ ...

  4. [BZOJ4730][清华集训2016][UOJ266] Alice和Bob又在玩游戏

    题意:俩智障又在玩游戏.规则如下: 给定n个点,m条无向边(m<=n-1),保证无环,对于每一个联通块,编号最小的为它们的根(也就是形成了一片这样的森林),每次可以选择一个点,将其本身与其祖先全 ...

  5. 【bzoj4730】 Alice和Bob又在玩游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=4730 (题目链接) 题意 给出一个森林,两个人轮流操作,每次把一个节点以及它的祖先全部抹去,无节点可 ...

  6. uoj#266. 【清华集训2016】Alice和Bob又在玩游戏(博弈论)

    传送门 完了我连sg函数是个啥都快忘了 设\(sg[u]\)为以\(u\)为根节点的子树的\(sg\)函数值,\(rem[u]\)表示\(u\)到根节点的路径删掉之后剩下的游戏的异或值 根节点\(u\ ...

  7. UOJ 266 - 【清华集训2016】Alice和Bob又在玩游戏(SG 定理+01-trie)

    题面传送门 神仙题. 首先注意到此题的游戏是一个 ICG,故考虑使用 SG 定理解决这个题,显然我们只需对每个连通块计算一遍其 SG 值异或起来检验是否非零即可.注意到我们每删除一个点到根节点的路径后 ...

  8. UOJ#266. 【清华集训2016】Alice和Bob又在玩游戏 博弈,DSU on Tree,Trie

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ266.html 题解 首先我们可以直接暴力 $O(n^2)$ 用 sg 函数来算答案. 对于一个树就是枚举 ...

  9. 【清华集训2016】Alice和Bob又在玩游戏

    不难的题目.因为SG性质,所以只需要对一棵树求出. 然后如果发现从上往下DP不太行,所以从下往上DP. 考虑一个点对子树的合并,考虑下一个删的点在哪一个子树,那么剩下的状态实际上就是把一个子树所有能达 ...

随机推荐

  1. linux通过端口号查找程序执行路径

    第一种: 查看ssh服务 [root@localhost shell]# netstat -anlp | grep :22tcp        0      0 0.0.0.0:22          ...

  2. PHP中FOREACH()用法

    PHP 4 引入了 foreach 结构,和 Perl 以及其他语言很像.这只是一种遍历数组简便方法.foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误. 1. ...

  3. mac中使用brew安装软件,下载太慢怎么办?

    mac中使用brew安装软件,下载太慢怎么办? 本文所说的软件是指较大的软件,如果软件较小,例如软件只有几M,那么使用此方法后,提升会非常小. 了解brew原理: 1: 从网络下载安装包 2: 执行一 ...

  4. ubuntu eclipse 中安装 python + PyDev

    参照网络和个人总结 系统配置:ubuntu12.04       jdk:1.6      eclipse:3.4 首先你的系统必须安装好pyton .也ubuntu系统自带的 刚开始以为是jdk安装 ...

  5. Exercise 24: More Practice

    puts "Let's practice everything." puts 'You\'d need to know \'bout escapes with \\ that do ...

  6. Linux搭建SVN服务器

    1 安装SVN 官网下载:http://subversion.apache.org/packages.html SVN客户端:TortoiseSVN,官网下载:http://tortoisesvn.n ...

  7. 用ajax提交form表单及乱码问题

    要求 1. form里是习题和选择的答案包含内容较多,直接用ajax获取页面元素较多,麻烦. 2. 也不能直接用form提交,form提交后会跳转页面,如果出错想在本页面获取错误信息(ajax提交)且 ...

  8. 十分钟了解分布式计算:Google Dataflow

    介绍 Google Cloud Dataflow是一种构建.管理和优化复杂数据处理流水线的方法,集成了许多内部技术,如用于数据高效并行化处理的Flume和具有良好容错机制流处理的MillWheel.D ...

  9. 用sql语句建表

    CREATE TABLE USER (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(30) NOT NULL, p ...

  10. Laravel框架数据库CURD操作、连贯操作使用方法

    Laravel框架数据库CURD操作.连贯如何来操作了这个操作性是非常的方便简单了我们在这里来为各位介绍一篇相关的教程,具体的细节步骤如下文介绍.   Laravel是一套简洁.优雅的PHP Web开 ...