伪ETT?

貌似就是Splay维护dfn = =

我们首先观察这个博弈

这个博弈直接%(l+1)应该还是很显然的 因为先手怎么操作后手一定能保证操作总数取到(l+1)

于是就变成阶梯Nim了 因为对于先手从深度奇数点挪到深度偶数点后手接着可以把它挪回深度偶数点 所以就是典型的阶梯Nim

我们可以发现 只需要维护子树到一个点深度差为奇数的点的异或和就可以了

这个操作显然可以对整棵树按深度黑白染色 分别维护奇数层&偶数层即可(我这里用的是总和和奇数和

对于添加一个点那么我们直接把它挂到父亲后面就可以了 因为子树顺序对答案没有影响

然后调起来有点烦 这里学习到一个新的套路 就是新建一个Null节点 满足所有的边界条件 把它放在最后 这样就可以避免死循环的情况= =

然后这个思博样例显然没有卵用 需要自己造数据 然后我忘了要异或^mz 于是造出一堆不合法数据在那调 xtbl

写起来其实挺短的 和ETT没毛关系的样子。

//Love and Freedom.
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define ll long long
#define inf 20021225
#define N 100001
#define ls(x) t[x].son[0]
#define rs(x) t[x].son[1]
#define Null N-1
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
struct edge{int to,lt;}e[N<<];
int in[N],cnt,poi,idfn[N];
void add(int x,int y)
{
e[++cnt].to=y; e[cnt].lt=in[x]; in[x]=cnt;
e[++cnt].to=x; e[cnt].lt=in[y]; in[y]=cnt;
}
struct node{int son[],fa,val,sum,mn,sz;}t[N];
// val sg_odd sum sg_full mn min_dep sz
int dep[N],a[N],x,rt;
void pushup(int x)
{
t[x].sz=t[ls(x)].sz+t[rs(x)].sz+;
t[x].sum=t[ls(x)].sum^t[rs(x)].sum^a[x];
t[x].val=t[ls(x)].val^t[rs(x)].val^(dep[x]&?a[x]:);
t[x].mn=min(dep[x],min(t[ls(x)].mn,t[rs(x)].mn));
}
void rotate(int x)
{
int f=t[x].fa,gf=t[f].fa;
int p=(rs(f)==x),k=p^;
t[gf].son[rs(gf)==f]=x;
if(t[x].son[k]) t[t[x].son[k]].fa=f;
t[f].son[p]=t[x].son[k]; t[x].fa=gf;
t[x].son[k]=f; t[f].fa=x;
pushup(f); pushup(x);
}
void splay(int x,int goal)
{
while(t[x].fa!=goal)
{
int f=t[x].fa,gf=t[f].fa;
if(gf!=goal)
(rs(f)==x)^(rs(gf)==f)?rotate(x):rotate(f);
rotate(x);
}
if(!goal) rt=x;
}
void dfs(int x,int f)
{
if(f) dep[x]=dep[f]+;
if(rt) t[x].fa=rt,t[rt].son[]=x;
splay(x,);
for(int i=in[x];i;i=e[i].lt) if(e[i].to!=f)
dfs(e[i].to,x);
}
void insert(int x,int f,int v)
{
splay(f,); dep[x]=dep[f]+; a[x]=v;
t[t[f].son[]].fa=x; t[x].son[]=t[f].son[];
t[f].son[]=x; t[x].fa=f; pushup(x); pushup(f);
}
int get(int x,int d)
{
if(t[ls(x)].mn<=d) return get(ls(x),d);
else if(dep[x]<=d) return x;
else return get(rs(x),d);
}
void put(int x)
{
if(ls(x)) put(ls(x));
printf("%d %d %d %d %d %d\n",x,ls(x),rs(x),t[x].fa,t[x].val,t[x].mn);
if(rs(x)) put(rs(x));
}
int main()
{
int n=read(),l=read(),x,y,v; dep[]=t[].mn=inf;
for(int i=;i<=n;i++) a[i]=read()%(l+);
for(int i=;i<n;i++) x=read(),y=read(),add(x,y);
dep[]=; dfs(,); t[Null].fa=rt; t[rt].son[]=Null; splay(Null,);
int q=read(),mz=;
while(q--)
{
int opt=read();
if(opt==)
{
x=read()^mz; splay(x,); int remx=x;
//printf("%d %d\n",rs(x),remx);
splay(get(rs(x),dep[x]),x); x=ls(rs(x));
int ans=(dep[remx]&)?t[x].sum^t[x].val:t[x].val;
if(ans) printf("MeiZ\n"),mz++;
else printf("GTY\n");
}
else if(opt==)
{
x=read()^mz; v=read()^mz;// printf("%d %d\n",x,v);
splay(x,); a[x]=v%(l+); pushup(x);
//put(x);
}
else
{
x=read()^mz; y=read()^mz; v=read()^mz;
insert(y,x,v%(l+));
}
}
return ;
}

BZOJ 3729 GTY的游戏的更多相关文章

  1. BZOJ 3729 - Gty的游戏(Staircase 博弈+时间轴分块)

    题面传送门 介于自己以前既没有写过 Staircase-Nim 的题解,也没写过时间轴分块的题解,所以现在就来写一篇吧(fog 首先考虑最极端的情况,如果图是一条链,并且链的一个端点是 \(1\),那 ...

  2. BZOJ 3729: Gty的游戏 [伪ETT 博弈论]【学习笔记】

    题意: 给定一棵有根树,每个节点有一些石子,每次可以将不多于k的石子移动到父节点 修改一个点的石子数,插入一个点,询问某棵子树是否先手必胜 显然是一个阶梯Nim 每次最多取k个,找规律或者观察式子易发 ...

  3. BZOJ 3729 Gty的游戏 ——Splay

    很久很久之前,看到Treap,好深啊 很久之前看到Splay,这数据结构太神了. 之后学习了LCT. 然后看到Top-Tree就更觉得神奇了. 知道我见到了这题, 万物基于Splay 显然需要维护子树 ...

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

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

  5. [BZOJ3729]Gty的游戏

    [BZOJ3729]Gty的游戏 试题描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动 ...

  6. bzoj 3991: [SDOI2015]寻宝游戏 虚树 set

    目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...

  7. bzoj 3232: 圈地游戏

    bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...

  8. [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)

    [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...

  9. [BZOJ 3731] Gty的超级妹子树 (树分块)

    [BZOJ 3731] Gty的超级妹子树 (树分块) 题面 给出一棵树(或森林),每个点都有一个值.现在有四种操作 1.查询x子树里>y的值有多少个 2.把点x的值改成y 3.添加一个新节点, ...

随机推荐

  1. 20175214 《Java程序设计》第11周学习总结

    20175214 <Java程序设计>第11周学习总结 本周学习任务总结 1.根据<java2实用教程>和蓝墨云学习视频学习第十三章: 2.尝试将课本重点内容用自己的话复述手打 ...

  2. tree 命令

    LMXMN117:Mac Driver will.wei$ tree -N >/tmp/savs.txt       (1)tree -a 显示所有文件和目录   (2)tree -d 显示目录 ...

  3. 【后台管理系统】—— Ant Design Pro组件使用(一)

    一.搜索Search      搜索框 <Search placeholder="请输入关键字" defaultValue={kw && kw != 'nul ...

  4. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第4节 多态_15_多态的概述

    不是多种状态,而是有多种形态 继承是多态的前提 子类就是一个父类.学生就是一个人 多态性说的是这个对象.

  5. 测开之路一百零四:jquery操作样式

    jquery操作样式 添加样式.删除样式 切换样式 css("属性","值") css("属性","值"), 修改多个 ...

  6. Jmeter之用户参数和用户定义的变量

    在调试脚本的时候,可以使用前置处理器中的用户参数组件进行数据的提供,在该数据中可以使用固定值也可以使用变量值. 如果是固定不变的一些配置项,不需要多个值的时候,也可以使用用户已定义的变量组件. 一.界 ...

  7. altium学习之常用快捷键

    1.放大缩小:常用方法,ctrl+鼠标滚轮,鼠标中键+移动鼠标,pgup.pgup. 2.切换不同的布线层:ctrl+shift+鼠标滚轮 3.在SCH或者PCB 同一平面内左右翻转:ctrl+X 4 ...

  8. 【EWM系列】SAP EWM创建warehouse task的函数

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP EWM创建warehouse ...

  9. [c#]Extesion method

    做一个类似Vb.net里面with的方法 public static void Use<T>(this T item, Action<T> work) { work(item) ...

  10. 【mysql】select子句顺序

    sleect…from (1)where (2)group by (3)having (4)order by (5)limit