http://www.lydsy.com/JudgeOnline/problem.php?id=4730 (题目链接)

题意

  给出一个森林,两个人轮流操作,每次把一个节点以及它的祖先全部抹去,无节点可以抹去是算输,问是否存在先手必胜策略。

Solution

  trie树合并,其实就是线段树合并。

  bzoj4134的简单版:http://blog.csdn.net/werkeytom_ftd/article/details/50958988

细节

  二进制小心写错

代码

  1. // bzoj4730
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<cmath>
  8. #include<queue>
  9. #define LL long long
  10. #define inf (1ll<<60)
  11. #define Pi acos(-1.0)
  12. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  13. using namespace std;
  14.  
  15. const int maxn=1000010;
  16. int head[maxn],vis[maxn],SG[maxn],rt[maxn],n,m,sz,cnt,bin[30];
  17. struct edge {int to,next;}e[maxn<<1];
  18. struct node {
  19. int ls,rs,tag,size;
  20. void Init() {ls=rs=tag=size=0;}
  21. }tr[maxn<<2];
  22.  
  23. void link(int u,int v) {
  24. e[++cnt]=(edge){v,head[u]};head[u]=cnt;
  25. e[++cnt]=(edge){u,head[v]};head[v]=cnt;
  26. }
  27. void pushdown(int k,int x) {
  28. if (tr[k].tag&bin[x-1]) swap(tr[k].ls,tr[k].rs);
  29. tr[tr[k].ls].tag^=tr[k].tag;
  30. tr[tr[k].rs].tag^=tr[k].tag;
  31. tr[k].tag=0;
  32. }
  33. void insert(int &k,int x,int y) {
  34. if (!k) k=++sz;tr[k].Init();
  35. tr[k].size=1;if (!y) return;
  36. x&bin[y-1] ? insert(tr[k].rs,x,y-1) : insert(tr[k].ls,x,y-1);
  37. }
  38. int merge(int x,int y,int k) {
  39. if (!x || !y) return x|y;
  40. pushdown(x,k);pushdown(y,k);
  41. tr[x].ls=merge(tr[x].ls,tr[y].ls,k-1);
  42. tr[x].rs=merge(tr[x].rs,tr[y].rs,k-1);
  43. tr[x].size=tr[tr[x].ls].size+tr[tr[x].rs].size+(k==0);
  44. return x;
  45. }
  46. void dfs(int x,int fa) {
  47. int t=0;vis[x]=1; //t表示儿子的SG异或和
  48. for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa) {
  49. dfs(e[i].to,x);
  50. t^=SG[e[i].to];
  51. }
  52. insert(rt[x],t,20); //此时插入的是删除x所得到的后继状态的SG值
  53. for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa) {
  54. tr[rt[e[i].to]].tag=t^SG[e[i].to]; //异或上除e[i].to以外其它儿子节点子树的SG
  55. rt[x]=merge(rt[x],rt[e[i].to],20);
  56. }
  57. for (int i=20,p=rt[x];i;i--) {
  58. pushdown(p,i);
  59. if (tr[tr[p].ls].size<bin[i-1]) p=tr[p].ls;
  60. else SG[x]|=bin[i-1],p=tr[p].rs;
  61. }
  62. }
  63. int main() {
  64. bin[0]=1;for (int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;
  65. int T;scanf("%d",&T);
  66. while (T--) {
  67. sz=0;cnt=0;
  68. for (int i=1;i<=n;i++) vis[i]=rt[i]=SG[i]=head[i]=0;
  69. scanf("%d%d",&n,&m);
  70. for (int u,v,i=1;i<=m;i++) {
  71. scanf("%d%d",&u,&v);
  72. link(u,v);
  73. }
  74. int ans=0;
  75. for (int i=1;i<=n;i++)
  76. if (!vis[i]) dfs(i,0),ans^=SG[i];
  77. puts(ans ? "Alice" : "Bob");
  78. }
  79. return 0;
  80. }

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

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

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

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

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

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

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

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

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

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

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

  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. spring-boot dubbo项目使用docker方式部署

    项目结构 本项目采用maven构建,有三个模块,分别是pms-interfaces, pms-services, pms-portal. 模块 描述 pms-interfaces 接口层,只能存放实体 ...

  2. RESTful API设计概要

    一.简介 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fiel ...

  3. 2017-2018-2 20155310『网络对抗技术』Exp5:MSF基础应用

    2017-2018-2 20155310『网络对抗技术』Exp5:MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:由攻击者或渗透测试者利 ...

  4. POJ2488&&3083&&3009&&1321&&2251&&2049

    刷完了大力数据结构(水比数据结构专题)后又开始搞无脑搜索专题了 这次的标签是DFS(这TM的到现在了谁还不会) 2488 跳马问题:给出一个棋盘,让你求一个方案使一匹马能花最短的时间不重复不遗漏地跳完 ...

  5. 学会查看Linux手册页(man文档)

    区段1:用户指令区段2:系统调用区段3:程序库调用区段4:设备区段5:文件格式区段6:游戏区段7:杂项区段8:系统指令区段9:内核内部指令区段n:Tcl或Tk指令 如果记不清楚工具或者函数的完整名字, ...

  6. 【第八课】php-fpm.conf配置文件解析

    在discuz论坛的nginx配置文件当中,我们可以看到有一段php解析的配置,如下: location ~ \.php$ { try_files $uri = 404; fastcgi_pass 1 ...

  7. 记一次Java加密加签算法到php的坑

    此文为本人原创首发于 http://www.35coder.com/convert_encryption_codes_to_php/. 写代码的经历中,总少不了与外部的程序对接,一旦有这样的事,往往周 ...

  8. 软件工程第二次作业(JUnit的使用)

    初次使用JUnit 感谢学习资源Junit使用的超简单介绍源 一.开发环境及界面截图: 系统   Windows 10      编辑器       eclipse         语言        ...

  9. HTML 样式 (style) 实例

    77.HTML 样式 (style) 实例HTML 的 style 属性style 属性的作用: 提供了一种改变所有 HTML 元素的样式的通用方法. 样式是 HTML 4 引入的,它是一种新的首选的 ...

  10. it喜爱的歌词

    1.曼丽 我们的过去我们的情义怎么能忘记  #曼丽你怎么这样忍心静静的就离去 #我很伤心从今以后不能够见到你 #只有留下你往日的情景使我常回忆 #一样的青山一样的绿水只有我和你 #曼丽可记得我们时常快 ...