伪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. Spring整合Hibernate实现Spring Data JPA (介绍和使用)

    Spring Data JPA是Spring基于Hibernate开发的一个JPA框架.如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便. 但是Sprin ...

  2. Android Build System Ultimate Guide

    Android Build System Ultimate Guide April 8,2013 Lately, Android Open Source Project has gone throug ...

  3. How to derive mean and variance of a Gaussian?

    PRML exercise 1.8: To derive mean: change of variable z = x - u, use symmetry To derive variance: di ...

  4. ConcurrentLinkedQueue 源码分析

    ConcurrentLinkedQueue ConcurrentLinkedQueue 能解决什么问题?什么时候使用 ConcurrentLinkedQueue? 1)ConcurrentLinked ...

  5. vue组件父与子通信-登录窗口

    一.组件间通信(父组件    -->  子组件)步骤:①父组件在调用子组件 传值 <child-component myValue="123"> </chi ...

  6. 剑指offer--day04

    1.1题目:变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 1.2解题思路: 当n=1时,结果为1: 当n=2时,结果为2: ...

  7. Qt之UI文件设计和运行机制

    1.项目文件组成在QtCreator中新建一个WidgetApplocation项目,选中窗口基类中选中QWidget作为窗口基类,并选中"GnerateForm"复选框.创建后项 ...

  8. 【题解】Shortest Cycle

    原题链接:CF1205B   题目大意   给定\(n\)个整数\(a_1,a_2,a_3, \dots ,a_n\),若\(i \neq j\)且\(a_i \land a_j \neq 0\),则 ...

  9. 生产者消费者模型(JoinableQueue)

  10. SCAU 2015 GDCPC team_training1

    A: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1525 题意:前两段都是废话 , 然后给出一个 p( p(a) ) = p(a) 的公式给你 ...