题目链接:Alice和Bob又在玩游戏

  这道题就是一个很显然的公平游戏。

  首先\(O(n^2)\)的算法非常好写。暴力枚举每个后继计算\(mex\)即可。注意计算后继的时候可以直接从父亲转移过来,没必要\(O(n)\)扫一遍所有节点 。

  然后我们仔细看看转移,就可以发现这玩意儿就是一个集合,每次要支持集合异或上一个数,集合插入一个数,以及集合合并。然后我们用\(Trie\)树(其实就是线段树)来维护即可。每个节点记录一个\(size\),就可以从顶往下找\(mex\)了。

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 100010
#define MAXN 1600010 using namespace std;
typedef long long llg; int T,n,m,sg[maxn],ans;
int head[maxn],next[maxn<<1],to[maxn<<1],tt;
int s[MAXN][2],rt[maxn],ao[MAXN],siz[MAXN];
bool vis[maxn]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} int pop(){int u=++tt;s[u][0]=s[u][1]=ao[u]=0;siz[u]=1;return u;}
void link(int x,int y){
to[++tt]=y;next[tt]=head[x];head[x]=tt;
to[++tt]=x;next[tt]=head[y];head[y]=tt;
} void pudn(int u,int k){
if((ao[u]>>k)&1) swap(s[u][0],s[u][1]);
int o=ao[u]&((1<<k)-1); ao[u]=0;
ao[s[u][0]]^=o;ao[s[u][1]]^=o;
} int merge(int u,int v,int k){
if(!u || !v) return u+v;
pudn(u,k); pudn(v,k);
s[u][1]=merge(s[u][1],s[v][1],k-1);
s[u][0]=merge(s[u][0],s[v][0],k-1);
return u;
} int getans(int u){
int now=0;
for(int i=16;i>=0;i--){
now<<=1;
if(siz[s[u][0]]<(1<<i)) u=s[u][0];
else u=s[u][1],now|=1;
}
return now;
} void ins(int &u,int x,int k){
if(!u) u=pop();
if(k>=0){
pudn(u,k); ins(s[u][(x>>k)&1],x,k-1);
siz[u]=siz[s[u][0]]+siz[s[u][1]];
}
} void dfs(int u,int fa){
vis[u]=1; int now=0;
for(int i=head[u],v;v=to[i],i;i=next[i])
if(v!=fa) dfs(v,u),now^=sg[v];
for(int i=head[u],v;v=to[i],i;i=next[i])
if(v!=fa) ao[rt[v]]^=now^sg[v],rt[u]=merge(rt[u],rt[v],16);
ins(rt[u],now,16),sg[u]=getans(rt[u]);
} int main(){
File("a");
T=getint();
while(T--){
n=getint(),m=getint(); ans=tt=0;
while(m--) link(getint(),getint());
for(int i=1;i<=n;i++)
if(!vis[i]) tt=0,dfs(i,0),ans^=sg[i];
printf(ans?"Alice\n":"Bob\n");
for(int i=1;i<=n;i++) rt[i]=sg[i]=head[i]=vis[i]=0;
}
return 0;
}

  BZOJ提交网址:BZOJ 4730 Alice和Bob又在玩游戏

UOJ #266 【清华集训2016】 Alice和Bob又在玩游戏的更多相关文章

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

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

  2. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

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

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

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

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

  5. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

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

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

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

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

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

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

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

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

随机推荐

  1. TextureMerger1.6.6 二:Sprite Sheet的制作和使用

    本随笔记录下Sprite Sheet的制作和使用 Sprite Sheet主要用于将零碎的小图合并成一张整图.减少加载图片时http的请求次数. 1 打开TextureMerger,选择Sprite ...

  2. MUI极简的JS函数

    模块:utils http://dev.dcloud.net.cn/mui/util/#event mui.init(); mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需 ...

  3. Thinkphp自定义工具类的使用!

    在使用Thinkphp做开发的时候,很多时候会用到一些自己写的类,为了方便管理,可以把这些类,单独放到一个文件里. 这就是自定义工具类: 首先在 Application 目录下新建 Component ...

  4. Redis快速起步及Redis常用命令大全

    本系列教程内容提要 Java工程师之Redis实战系列教程教程是一个学习教程,是关于Java工程师的Redis知识的实战系列教程,本系列教程均以解决特定问题为目标,使用Redis快速解决在实际生产中的 ...

  5. Yii2框架添加API Modules

    原文链接:http://www.itnose.net/detail/6459353.html : 一.环境部署 1. read fucking Yii Documents. http://www.yi ...

  6. 奇怪的Visual Studio 2013停止响应问题

    昨天开始遭遇这个问题,今天再次遭遇. 疑似问题发生在写代码的窗口中复制/粘贴时(有待进一步确认触发条件),突然停止响应,出现下面的对话框: 对话框中的文字为: Waiting for a requir ...

  7. Oracle HA 之ADVM和ACFS

    --ADVM ADVM主要是为了使除了数据库之外的第三方应用程序也可以使用asm存储,这样不限于使asm局限于自家的数据库领域.要想使用ADVM首先必须安装grid,已经创建好了asm磁盘,asm磁盘 ...

  8. expdp全库备份rac数据库因错误终止

    1.expdp导出日志报错如下: ORA-39014: One or more workers have prematurely exited. ORA-39029: worker 2 with pr ...

  9. In ZeroDB, the client is responsible for the database logic. Data encryption, decryption, and compression also happen client side. Therefore, the server never has any knowledge about the data, its str

    zerodb/index.rst at master · zerodb/zerodb https://github.com/zerodb/zerodb/blob/master/docs/source/ ...

  10. CEO 是一家创业公司的天花板

    大家说是不是呢?一秒钟内看到本质的人,和半辈子也看不清一件事本质的人,自然是不一样的命运.