很久很久之前,看到Treap,好深啊

很久之前看到Splay,这数据结构太神了。

之后学习了LCT。

然后看到Top-Tree就更觉得神奇了。

知道我见到了这题,

万物基于Splay

显然需要维护子树查询,插入,子树修改。

Top-Tree?我不会。

直接用Splay维护欧拉序,然后拆成进入子树和离开两个节点,然后就可以方便的维护子树了。

本蒟蒻不会写,去hzwer抄了

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair #define maxn 200005 int n,m,L,mod;
int rt,ind,ynum,top;
int val[maxn],fa[maxn],ch[maxn][2],typ[maxn],sg[maxn][2];
int a[maxn],st[maxn],dep[maxn],pos[maxn][2]; map <int,int> id;
vector <int> e[maxn]; void update(int x)
{
int l=ch[x][0],r=ch[x][1];
sg[x][0]=sg[l][0]^sg[r][0];
sg[x][1]=sg[l][1]^sg[r][1];
sg[x][typ[x]]^=val[x];
} void rot(int x,int &k)
{
// printf("rot %d %d\n",x,k);
int y=fa[x],z=fa[y],l,r;
l=(ch[y][1]==x);r=l^1;
if(y==k)k=x;
else ch[z][ch[z][1]==y]=x;
fa[ch[x][r]]=y;fa[y]=x;fa[x]=z;
ch[y][l]=ch[x][r];ch[x][r]=y;
update(y);update(x);
} void splay(int x,int &k)
{
// printf("splay %d\n",x);
while (x!=k)
{
int y=fa[x],z=fa[y];
if (y!=k)
{
if (ch[y][0]==x^ch[z][0]==y) rot(x,k);
else rot(y,k);
}
rot(x,k);
}
} int build(int l,int r,int f)
{
if (l>r) return 0;
int mid=(l+r)/2;
if (st[mid]>0)
{
val[mid]=a[st[mid]];
pos[st[mid]][0]=mid;
}
else pos[-st[mid]][1]=mid;
typ[mid]=dep[abs(st[mid])]; fa[mid]=f;
ch[mid][0]=build(l,mid-1,mid);
ch[mid][1]=build(mid+1,r,mid);
update(mid);
return mid;
} void ins(int u,int v,int num)
{
splay(pos[u][0],rt);
int t=ch[rt][1]; while (ch[t][0]) t=ch[t][0];
int t1=++top,t2=++top;
pos[v][0]=t1;pos[v][1]=t2;
fa[t1]=t;fa[t2]=t1;
ch[t][0]=t1; ch[t1][1]=t2;
val[t1]=num; typ[t1]=typ[t2]=dep[v];
update(t2);update(t1);splay(t2,rt);
} void query(int x)
{
splay(pos[x][0],rt);
splay(pos[x][1],ch[rt][1]);
if (sg[ch[pos[x][1]][0]][dep[x]^1])
{
ynum++;
puts("MeiZ");
}
else puts("GTY");
} void dfs(int x)
{
// printf("DFs %d\n",x);
st[++top]=x;
for (int i=0;i<e[x].size();++i)
{
dep[e[x][i]]=dep[x]^1;
dfs(e[x][i]);
}
st[++top]=-x;
} int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
// freopen("in.txt","r",stdin);
n=read(); L=read(); mod=L+1;
for (int i=1;i<=n;++i)
{
a[i]=read()%mod;
id[i]=i;
}
for (int i=1;i<n;++i)
{
int u,v;u=read();v=read();
e[u].push_back(v);
}
dfs(1); rt=build(1,top,0);
m=read();
int opt,u,v,x;
while (m--)
{
opt=read();
if (opt==1)
{
v=read();
v^=ynum;
query(id[v]);
}
if (opt==2)
{
x=read(); x^=ynum;
v=read(); v^=ynum; v%=mod;
x=id[x];splay(pos[x][0],rt);val[rt]=v;
update(rt);
}
if (opt==3)
{
u=read(); u^=ynum;
v=read(); v^=ynum;
x=read(); x^=ynum;
u=id[u]; id[v]=++n;
dep[n]=dep[u]^1;
ins(u,n,x%mod);
}
}
}

  

BZOJ 3729 Gty的游戏 ——Splay的更多相关文章

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

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

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

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

  3. BZOJ 3729 GTY的游戏

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

  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. Unity中的各种寻找GameObject方法归纳

    1.GameObject.Find():寻找Hierarchy面板中的activie 不为false的游戏对象: 路径如官方事例写法: public class ExampleClass : Mono ...

  2. 第011课_串口(UART)的使用

    from: 第011课_串口(UART)的使用 第001节_辅线1_硬件知识_UART硬件介绍 1. 串口的硬件介绍 UART的全称是 Universal Asynchronous Receiver ...

  3. linux文本处理工具及正则表达式

    cat命令:查看文本内容 cat [选项]... [文件]... -E    显示行结束符 -n    显示文本内容时显示行号 -A    显示所以控制符 -b    非空行编号 -s     压缩连 ...

  4. opensue "Have a lot of fun..."的出处

    每次登陆opensuse都会出现“Have a lot of fun...”,觉得奇怪. 通过搜索发现在这是/etc/motd文件中配置的. MOTD(5)                       ...

  5. 关于SpringMVC注解

    1.@RequestMapping RequestMapping是一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中),可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址 ...

  6. java基础——Map集合

    Map以键值对的形式存储数据,其中Map.entry,是Map的内部类,它用来描述Map中的键值对.Map是一个接口,HashMap是他的一个实现类 Map中有几个重要的方法: get(Object ...

  7. mysql中影响数据库性能的因素讲解

    mysql中影响数据库性能的因素讲解 在本篇文章中我们给大家讲述了mysql中影响性能的因素以及相关知识点内容,有兴趣的朋友参考下 关于数据库性能的故事 面试时多多少少会讲到数据库上的事情,“你对数据 ...

  8. 性能优化之MySQL优化(慕课)

    MySQL数据库优化 1-1MySQL优化简介 数据库优化的目的 避免出现页面访问错误 由于数据库连接timeout产生5XX错误 由于慢查询造成页面无法加载 由于阻塞造成数据无法提交 增加数据库的稳 ...

  9. linux 下 docker-compose安装

    docker和dockers-compose的版本兼容对照 以下是我的服务器的相关信息 linux版本 [root@izbp16fm097gaw3tdaog2wz bin]# cat /proc/ve ...

  10. Linux学习-仅执行一次的工作排程

    atd 的启动与 at 运作的方式 要使用单一工作排程时,我们的 Linux 系统上面必须要有负责这个排程的服务,那就是 atd 这个玩 意儿. 不过并非所有的 Linux distributions ...