题面

传送门

前置芝士

巴什博奕

\(Nim\)游戏的改版,我们现在每次最多只能取走\(k\)个石子,那么\(SG\)函数很容易写出来

\[SG(x)=mex_{i=1}^{\min(x,k)}SG(x-i)
\]

有\(SG(0)=0\),用归纳法易知\(SG(x)=x\bmod (k+1)\)

阶梯博弈

有\(n\)级台阶,从\(0\)级开始数到\(n\)级。每级上都有一定的石子。每次可以把一个阶梯的石子往下移,\(0\)级阶梯的不能移,不能操作者输。

这里有一个结论,我们只需要考虑所有奇数层,该游戏就等价于\(Nim\)游戏

为啥嘞?

首先偶数层是不会有任何影响的,因为如果你移动偶数层若干个石子到奇数层,那么对手一定可以通过移动把你移的石子移到下一个偶数层,相当于这些石子仍然在偶数层。如果移动奇数层的石子,我们就默认它消失了

题解

那么这题就比较明显了,首先很容易算出每个节点的\(SG\)值,那么对于一个节点\(u\),如果它的深度是奇数,那么答案就是它子树里所有深度为偶数的节点的\(SG\)值的异或和之和,如果不为\(0\)说明妹子赢,否则\(gty\)赢

于是我们需要在线维护子树深度为奇数的节点的异或和以及深度为偶数的节点的异或和(代码里是维护子树总的异或和和深度为奇数的节点的异或和),并且还要资瓷插入节点

那么用\(ETT\)就好了(也就是\(Splay\)维护\(dfs\)序),而且这里只需要单括号欧拉序就可以了

不过这里有个问题是单括号欧拉序我该怎么找子树代表的区间呢?

如果直接维护\(size\)应该可以做,但是\(size\)还需要链修改非常麻烦。我们可以在\(Splay\)上二分,对于节点\(u\),找到\(dfs\)序比它大的节点中最小的满足\(dep[v]\leq dep[u]\)的节点\(v\),那么\([u,v)\)这个范围就是子树的范围了。同时为了避免\(1\)找不到对应的\(v\),要插入一个虚拟节点,深度设为\(0\),且\(dfs\)序最大

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=E[i].v;i;i=E[i].nx,v=E[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
inline int getop(){R char ch;while((ch=getc())>'9'||ch<'0');return ch-'0';}
const int N=1e5+5;
inline int min(R int x,R int y){return x<y?x:y;}
struct eg{int v,nx;}E[N<<1];int head[N],tot;
inline void add(R int u,R int v){E[++tot]={v,head[u]},head[u]=tot;}
struct node;typedef node* ptr;
struct node{
ptr lc,rc,fa;int sum,s,d,v,mn;
inline node();
inline void init(R int ss,R int dd){mn=d=dd,sum=v=ss,s=ss*(d&1);}
inline ptr upd(){
mn=min(d,min(lc->mn,rc->mn)),
sum=lc->sum^rc->sum^v,
s=lc->s^rc->s^(v*(d&1));
return this;
}
}e[N],*rt;
inline node::node(){lc=rc=fa=e;}
void rotate(ptr &rt,ptr p){
ptr s=p->fa,t=s->fa;
if(s!=rt)(t->lc==s?t->lc:t->rc)=p;else rt=p;
s->fa=p,p->fa=t;
if(s->lc==p)s->lc=p->rc,p->rc->fa=s,p->rc=s->upd();
else s->rc=p->lc,p->lc->fa=s,p->lc=s->upd();
}
void splay(ptr &rt,ptr p){
while(p!=rt){
if(p->fa!=rt)rotate(rt,p->fa->lc==p^p->fa->fa->lc==p->fa?p:p->fa);
rotate(rt,p);
}
p->upd();
}
ptr get(ptr p,int d){
while(true){
if(p->lc->mn<=d)p=p->lc;
else if(p->d<=d)return p;
else p=p->rc;
}
}
int n,m,q,tim,cnt,res,dep[N],dfn[N],rk[N],a[N];
void dfs(int u,int fa){
dfn[u]=++tim,dep[u]=dep[fa]+1,rk[tim]=u;
go(u)if(v!=fa)dfs(v,u);
}
void build(ptr &p,int l,int r,ptr fa){
int mid=(l+r)>>1;p=e+rk[mid],p->fa=fa,p->init(a[rk[mid]],dep[rk[mid]]);
if(l<mid)build(p->lc,l,mid-1,p);
if(mid<r)build(p->rc,mid+1,r,p);
p->upd();
}
int main(){
// freopen("testdata.in","r",stdin);
// freopen("testdata.out","w",stdout);
n=read(),m=read(),e->d=e->mn=inf;
fp(i,1,n)a[i]=read()%(m+1);
for(R int i=1,u,v;i<n;++i)u=read(),v=read(),add(u,v),add(v,u);
dfs(1,0),build(rt,1,tim,e);
splay(rt,e+rk[tim]),rt->rc=(e+N-1),
(e+N-1)->init(0,0),(e+N-1)->fa=rt,rt->upd();
char op;int u,v,x;q=read();
ptr s,t;
while(q--){
op=read();
switch(op){
case 1:{
u=read()^cnt,s=e+u,splay(rt,s),
t=get(s->rc,dep[u]);
splay(s->rc,t);
res=dep[u]&1?t->lc->s^t->lc->sum:t->lc->s;
puts(res?(++cnt,"MeiZ"):"GTY");
break;
}
case 2:{
u=read()^cnt,v=read()^cnt,s=e+u,splay(rt,s);
s->v=v%(m+1),s->upd();
break;
}
case 3:{
u=read()^cnt,v=read()^cnt,x=read()^cnt,s=e+u,t=e+v;
dep[v]=dep[u]+1,a[v]=x%(m+1),t->init(a[v],dep[v]);
splay(rt,s),s->rc->fa=t,t->rc=s->rc,t->fa=s,s->rc=t;
t->upd(),s->upd();
break;
}
}
}
return 0;
}

BZOJ3729: Gty的游戏(伪ETT)的更多相关文章

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

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

  2. [BZOJ3729]Gty的游戏

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

  3. 【块状树】【博弈论】bzoj3729 Gty的游戏

    块状树,每个块的根记录一下当前块内距块根为奇数距离的异或和和偶数距离的异或和,询问的时候讨论一下即可. 总的节点数可能超过50000. #include<cstdio> #include& ...

  4. [BZOJ3786]星系探索(伪ETT)

    3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1638  Solved: 506[Submit][Status][Discuss ...

  5. BZOJ 3729 GTY的游戏

    伪ETT? 貌似就是Splay维护dfn = = 我们首先观察这个博弈 这个博弈直接%(l+1)应该还是很显然的 因为先手怎么操作后手一定能保证操作总数取到(l+1) 于是就变成阶梯Nim了 因为对于 ...

  6. BZOJ 3786: 星系探索 [伪ETT]

    传送门 数据,标程 题意: 一颗有根树,支持询问点到根路径权值和,子树加,换父亲 欧拉序列怎么求路径权值和? 一个点的权值只会给自己的子树中的点贡献,入栈权值正出栈权值负,求前缀和就行了! 和上题一样 ...

  7. BZOJ3786: 星系探索(伪ETT)

    题面 传送门 题解 坑啊--我好像把\(Splay\)的东西全忘光了-- \(ETT\)(\(Euler\ Tour\ Tree\))是一种可以资瓷比\(LCT\)更多功能的数据结构,然而不管是功能还 ...

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

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

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

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

随机推荐

  1. tensorflow笔记 :常用函数说明

    常用函数说明,梯度.产生变量等 http://blog.csdn.net/c2a2o2/article/details/69061539

  2. Why Go's Declaration Syntax is better than C++?

    [Why Go's Declaration Syntax is better than C++?] Newcomers to Go wonder why the declaration syntax ...

  3. Oracle的服务端_默认_启动的服务

  4. sql server 设置用户名和密码

    安全性:security 登录名:Logins 可以双击直接对里面现有的用户权限进行修改 也可以右击新建新用户 并对新用户权限进行设置

  5. Python 入门学习(壹)上机时间提醒

    基于 Udacity 的 Python 入门课程 Programming Foundations with Python 基于 Python 2.7 控制台版本 思路 Project 1 是一个时间提 ...

  6. mysql启动参数 skip-grant-tables

    非常有用的mysql启动参数—— --skip-grant-tables. 顾名思义,就是在启动mysql时不启动grant-tables,授权表.有什么用呢?当然是忘记管理员密码后有用. 在mysq ...

  7. JDeveloper 开发环境配置

    JDeveloper 开发环境配置 程序员的基础教程:菜鸟程序员

  8. 将Oracle数据库设置为归档模式及非归档模式

    一.将Oracle数据库设置为归档模式 1)sql>shutdown normal/immediate;2)sql>startup mount;3)sql>alter databas ...

  9. import c++ project to eclipse cdt with exiting makefile

    Step 2: You are now ready to build your project. To build your project, select Project > Build Pr ...

  10. 运行Junit单测时遇到的问题

    现在有两个办法解决: 1.junit版本降到4.10 2.导入hamcrest-core-1.3.jar 官网:JUnit now uses the latest version of Hamcres ...