题意:

给定一棵有根树,每个节点有一些石子,每次可以将不多于k的石子移动到父节点

修改一个点的石子数,插入一个点,询问某棵子树是否先手必胜


显然是一个阶梯Nim

每次最多取k个,找规律或者观察式子易发现就是$mod (k+1)$后的Nim

问题变为:

修改点权,插入点,询问某棵子树内某一深度的点权异或和

于是放大招了:伪$ETT$

真正的ETT貌似维护的是边,欧拉遍历序列也是边组成的序列

但我们用Splay来维护欧拉遍历的点的序列,入栈出栈时都加入队列,+1,-1,好像也叫括号序列

$build$过程中保存下每个点入栈和出栈对应的Splay上的节点编号,入栈正出栈负(一开始节点编号和序列编号是一样的)

本题的子树不需要根所以询问子树只要把那段区间splay出来就行了,需要根的找出区间的前驱后继splay他们就好了

加入新节点,分配两个dfs序编号给它,把新父亲和后继splay出来然后连上再更新就行了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define lc t[x].ch[0]
#define rc t[x].ch[1]
#define pa t[x].fa
#define pii pair<int, int>
#define MP make_pair
#define fir first
#define sec second
typedef long long ll;
const int N=1e5, INF=1e9;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;
}int n, m, k, a[N], Q, op, x, y, z, id[N];struct edge{int v, ne;} e[N<<1];
int cnt, h[N];
inline void ins(int u, int v) {e[++cnt]=(edge){v, h[u]}; h[u]=cnt;
}
int eul[N<<1], dfc, deep[N];
pii dfn[N];
void dfs(int u) {dfn[u].fir = ++dfc; eul[dfc]=u;for(int i=h[u];i;i=e[i].ne) deep[e[i].v] = deep[u]^1, dfs(e[i].v);dfn[u].sec = ++dfc; eul[dfc]=-u;
}struct meow{int ch[2], fa, v, sg[2], deep;} t[N<<1];
int root;
inline int wh(int x) {return t[pa].ch[1] == x;}
inline void update(int x) {t[x].sg[0] = t[lc].sg[0]^t[rc].sg[0];t[x].sg[1] = t[lc].sg[1]^t[rc].sg[1];t[x].sg[t[x].deep] ^= t[x].v;
}inline void rotate(int x) {int f=t[x].fa, g=t[f].fa, c=wh(x);if(g) t[g].ch[wh(f)] = x; t[x].fa=g;t[f].ch[c] = t[x].ch[c^1]; t[t[f].ch[c]].fa=f;t[x].ch[c^1]=f; t[f].fa=x;update(f); update(x);
}
inline void splay(int x, int tar) {for(; pa!=tar; rotate(x))if(t[pa].fa != tar) rotate(wh(x)==wh(pa) ? pa : x);if(tar==0) root=x;
}void build(int &x, int l, int r, int f) {int mid = (l+r)>>1; x=mid;t[x].fa=f; t[x].deep = deep[abs(eul[mid])];if(eul[mid]>0)  t[x].v = a[eul[mid]];if(l<mid) build(lc, l, mid-1, x);if(mid<r) build(rc, mid+1, r, x);update(x);
}int Que(int u) {int p = dfn[u].fir; splay(p, 0);int x = dfn[u].sec; splay(x, p);return t[lc].sg[deep[u]^1] > 0;
}
void ChaVal(int u, int d) {int x = dfn[u].fir; splay(x, 0);t[x].v = d; update(x);
}
inline int nex(int x) {x = rc; while(lc) x = lc; return x;
}
void Add(int u, int v, int d) {int p = dfn[u].fir; splay(p, 0);int x = nex(p); splay(x, p);int a = ++dfc, b = ++dfc;dfn[v] = MP(a, b);t[a].ch[1] = b; t[b].fa = a;t[a].fa = x; t[x].ch[0] = a;t[a].v = d; t[a].deep = t[b].deep = deep[v] = deep[u]^1;update(a); update(x); update(p);
}int main() {freopen("in","r",stdin);n=read(); k=read()+1;for(int i=1; i<=n; i++) a[i]=read()%k, id[i]=i;for(int i=1; i<n; i++) x=read(), y=read(), ins(x, y);dfs(1); build(root, 1, dfc, 0);Q=read();int meizi=0, ans;for(int i=1; i<=Q; i++) {op=read(); x=read()^meizi; x=id[x];if(op==1) ans=Que(x), meizi+=ans, puts(ans ? "MeiZ" : "GTY");else {y=read()^meizi;if(op==2) ChaVal(x, y%k);else z=(read()^meizi)%k, Add(x, id[y]=++n, z);}}return 0;
}

BZOJ 3729: Gty的游戏 [伪ETT 博弈论]【学习笔记】相关推荐

  1. BZOJ 3729: Gty的游戏

    这两三天貌似没怎么写blog 来补点 劲啊 这道题 我的数据结构真心菜.. 首先对于子树来搞 显然就是用dfs序 由于动态加点 我们用splay 考虑博弈 距离这层为偶数层的可以不管 奇数层的就像简单 ...

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

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

  3. 打地鼠游戏(2D)学习笔记

    打地鼠游戏(2D)学习笔记 制作流程 1. 导入素材.Sorting Layer(分层)和调整相机位置 分类建立文件夹,并导入如下素材: 为做到图层的覆盖,将图层进行分类 调整相机位置 2. 生成洞口 ...

  4. 博弈论学习笔记——纳什均衡与社会最优、破坏均衡的方法

    系列文章 博弈论学习笔记--博弈收益期望的计算与决策 博弈论学习笔记--纳什均衡与社会最优.破坏均衡的方法 博弈论学习笔记--拍卖原理 简介 在囚徒困境的情境中,二者的博弈会达到一个纳什均衡,即都会选 ...

  5. 游戏黑客圣经GHB1学习笔记 part1(1-5)

    游戏黑客圣经(Game Hacking Bible1) 我在这里记录我所有课程的学习笔记,包括一些小技巧以及源码,俗话说好记性不如烂笔头,写在这里,用于温故而知新. 前言 学习游戏黑客的必备条件 智力 ...

  6. 生命游戏和细胞自动机的学习笔记

    Last updated: 28 May, 2012 © 野比 2012 版权所有 (本文为个人学习笔记,知识浅薄,供大家乐乐) 欢迎对这方面感兴趣的爱好者一起研究. 寻求技术指导. 联系QQ 142 ...

  7. html5游戏引擎-Pharse.js学习笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 前几天随着flappy bird这样的小游戏的火爆,使我这种也曾了解过html5技术的js业余爱好者也开始关注游戏开 ...

  8. 游戏黑客圣经GHB1学习笔记 part4(16-20)

    16.How to Hack Any Game Tutorial C++ Trainer #2 - External v2(如何破解游戏-外部2) 这次我们需要记住的是两个比较重要的WindowsAP ...

  9. 博弈论学习笔记(三)迭代剔除和中位选民定理

    迭代剔除劣势策略 先找出劣势策略,剔除劣势策略,再继续审视这个博弈,找出哪些现在也成了劣势策略,然后剔除他们.如此反复进行,这个过程被称之为迭代剔除劣势策略.它揭示了以下过程的主旨:站在对方的立场上去 ...

最新文章

  1. 拖拽批量上传图片如何保证 顺序_使用 Eagle 探索图片管理新边界
  2. Python实现:详解LRU缓存淘汰算法
  3. 深入剖析 RocketMQ 源码 - 消息存储模块
  4. C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间...
  5. python字典相同key的值怎么分别取出_python字典值排序并取出前n个key值的方法
  6. Java并发编程(十三)同步容器类
  7. 在服务器托管中对流量和带宽进行限制
  8. python字符串大全_python学习笔记:字符串操作大全
  9. MKL学习——矩阵向量操作
  10. Myeclipse创建第一个web项目
  11. UVAL - 6755 - Swyper Keyboard
  12. matlab单元数组和结构,Matlab中单元数组和结构数组
  13. 物联网应用层安全威胁_物联网安全国家标准发布,物联网安全产业链确立
  14. Confluence 6 配置索引语言
  15. 动态路由之OSPF协议综合实验
  16. JavaScript面向对象轻松入门之概述(demo by ES5、ES6、TypeScript)
  17. 基于Python的旅游管理系统-小程序
  18. 从日企和水浒传看企业如何转型
  19. PPT 不支持打开显示 webp 图片
  20. Linux下的dd和cat

热门文章

  1. RabbitMQ 镜像模式 集群架构 工作最常用集群
  2. 设计模式--模板方法模式--Java实现-- java访问控制关键字用法
  3. golang rpc单参数调用实例
  4. 在golang中defer、panic与recover的作用
  5. 微信小程序瀑布流列表
  6. Springboot-importSelector
  7. Go源码里的 //go: 指令集眼熟嘛?都是干嘛的?
  8. 如何优雅地关闭Kubernetes集群中的Pod
  9. rtk手簿Android代码,合众思壮手簿eSurveyAndroid连接cors账号教程
  10. ChannelHandler 与 ChannelPipeline 详解