思路:

这像是 阶梯Nim之类的东西

我们 直接把sg函数 设成mod(L+1)的

一棵子树 向下的奇数层上的石子xor起来 就是答案

有加点和改值的操作 就splay维护一下

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int N=1000050,inf=0x3f3f3f3f,NULLL=N-1;
  7. int n,m,l,op,xx,yy,zz,cnt;
  8. int sg[N],sg_odd[N],sg_even[N];
  9. int first[N],next[N*2],v[N*2],tot;
  10. int root,fa[N],ch[N][2],deep[N],d[N];
  11. void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
  12. void push_up(int x){
  13. int lson=ch[x][0],rson=ch[x][1];
  14. d[x]=min(deep[x],min(d[lson],d[rson]));
  15. sg_odd[x]=sg_odd[lson]^sg_odd[rson];
  16. sg_even[x]=sg_even[lson]^sg_even[rson];
  17. if(deep[x]&1)sg_odd[x]^=sg[x];
  18. else sg_even[x]^=sg[x];
  19. }
  20. void rotate(int p){
  21. int q=fa[p],y=fa[q],x=(ch[q][1]==p);
  22. ch[q][x]=ch[p][!x],fa[ch[q][x]]=q;
  23. ch[p][!x]=q,fa[q]=p,fa[p]=y;
  24. if(y)ch[y][ch[y][1]==q]=p;
  25. push_up(q);
  26. }
  27. void splay(int x,int tp){
  28. for(int y;y=fa[x];rotate(x)){
  29. if(y==tp)break;
  30. if(fa[y]!=tp){
  31. if((ch[y][0]==x)^(ch[fa[y]][0]==y))rotate(x);
  32. else rotate(y);
  33. }
  34. }push_up(x);
  35. if(!tp)root=x;
  36. }
  37. void dfs(int x,int y){
  38. if(y)deep[x]=deep[y]+1;
  39. if(root)fa[x]=root,ch[root][1]=x;
  40. splay(x,0);
  41. for(int i=first[x];~i;i=next[i]){
  42. if(v[i]!=y)dfs(v[i],x);
  43. }
  44. }
  45. int find(int x,int y){
  46. if(d[ch[x][0]]<=y)return find(ch[x][0],y);
  47. if(deep[x]<=y)return x;
  48. return find(ch[x][1],y);
  49. }
  50. int main(){
  51. memset(first,-1,sizeof(first));
  52. scanf("%d%d",&n,&l),l++;
  53. for(int i=1;i<=n;i++)scanf("%d",&sg[i]),sg[i]%=l;
  54. for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);
  55. d[0]=deep[0]=inf,deep[1]=1,dfs(1,0);
  56. fa[NULLL]=root,ch[root][1]=NULLL,splay(NULLL,0);
  57. scanf("%d",&m);
  58. for(int i=1;i<=m;i++){
  59. scanf("%d",&op);
  60. if(op==1){
  61. scanf("%d",&xx),xx^=cnt;
  62. splay(xx,0);int temp=find(ch[xx][1],deep[xx]),ans=sg[xx];
  63. splay(temp,xx);
  64. if(deep[xx]&1)ans=sg_even[ch[temp][0]];
  65. else ans=sg_odd[ch[temp][0]];
  66. if(!ans)puts("GTY");
  67. else puts("MeiZ"),cnt++;
  68. }
  69. else if(op==2){
  70. scanf("%d%d",&xx,&yy),xx^=cnt,yy^=cnt;
  71. splay(xx,0);sg[xx]=yy%l;push_up(xx);
  72. }
  73. else{
  74. scanf("%d%d%d",&xx,&yy,&zz);
  75. xx^=cnt,yy^=cnt,zz^=cnt;zz%=l;
  76. sg[yy]=zz,deep[yy]=deep[xx]+1;
  77. splay(xx,0),fa[ch[xx][1]]=yy,fa[yy]=xx;
  78. ch[yy][1]=ch[xx][1],ch[xx][1]=yy;
  79. push_up(yy),push_up(xx);
  80. }
  81. }
  82. }

BZOJ 3729 splay维护DFS序+博弈论的更多相关文章

  1. 【BZOJ 3729】3729: Gty的游戏 (Splay维护dfs序+博弈)

    未经博主同意不得转载 3729: Gty的游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 448  Solved: 150 Description ...

  2. BZOJ3786 星系探索 【Splay维护dfs序】*

    BZOJ3786 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均 ...

  3. bzoj3786星系探索(splay维护dfs序)

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

  4. BZOJ 3991 set维护dfs序

    思路: set按照dfn排序 两点之间的距离可以O(logn)算出来 加一个点-> now ans+=dis(pre,now)+dis(now,next)-dis(pre-next); 删一个点 ...

  5. BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)

    题目大意: Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...

  6. BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)

    题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...

  7. BZOJ3159决战——树链剖分+非旋转treap(平衡树动态维护dfs序)

    题目描述 输入 第一行有三个整数N.M和R,分别表示树的节点数.指令和询问总数,以及X国的据点. 接下来N-1行,每行两个整数X和Y,表示Katharon国的一条道路. 接下来M行,每行描述一个指令或 ...

  8. CF877E Danil and a Part-time Job 线段树维护dfs序

    \(\color{#0066ff}{题目描述}\) 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 ...

  9. BZOJ 3779 重组病毒 LCT+线段树(维护DFS序)

    原题干(由于是权限题我就直接砸出原题干了,要看题意概述的话在下面): Description 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力 ...

随机推荐

  1. Java基础8一面向对象

    一.JavaBean标准的定义规范 1.类中所有的属性必须是私有的,也就是说属性必须用private修饰. 2.提供一个公共无参数的构造方法. 3.为所有私有的属性提供公共的set和get方法. se ...

  2. SQL学习整理

    SQL整理 SQL 对大小写不敏感! 一.对数据的操作 实现功能分类: 1. 增: 1.1 表存在,插入栏位: //插入新的行(按栏位的顺序插入) INSERT INTO Table_1 VALUES ...

  3. AngularJs轻松入门

    AngularJs轻松入门系列博文:http://blog.csdn.net/column/details/angular.html AngularJs轻松入门(一)创建第一个应用 AngularJs ...

  4. [原创]Java常见笔试题知识点汇总

    前天数梦工厂来学校招聘,笔试题比较有特点,全是Java题,基本就是Java的一些特点.凭记忆按照题目找到一些必备知识点 (1). try {}里有一个return语句,那么紧跟在这个try后的fina ...

  5. node linux服务器部署 centos

      1下载 wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz  2解压 tar xvf node-v6.9.5-linu ...

  6. jq遍历 下拉框

    var selectA1 = $("select[name=A1]"); //从A1下拉框中 搜索值 $(selectA1).children("option" ...

  7. BZOJ 1355: [Baltic2009]Radio Transmission AC自动机/KMP

    被一个KMP傻题搞蒙圈了,此题AC自动机空间超限,只能用KMP写(我只会AC自动机QAQ)...... AC自动机 Code: // luogu-judger-enable-o2 #include & ...

  8. 两个sed小技巧:sed "/变量/变量/"

    两个sed小技巧 在写shell时使用sed处理一些输出,遇到两个问题,在网上找到了相应的解决办法,在此处备份一下. [ sed处理空字符 ] 空字符,它的ASCII码值为0.在sed中如何标识空字符 ...

  9. Django的时间字段DateTimeField

    一. Django的时间字段DateTimeField 创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着 ...

  10. nyoj303-序号交换

    序号互换 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐标快速计算出来.单元格的行坐标是由数字编号 ...