BZOJ 3729 Gty的游戏 ——Splay
很久很久之前,看到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的更多相关文章
- BZOJ 3729 - Gty的游戏(Staircase 博弈+时间轴分块)
题面传送门 介于自己以前既没有写过 Staircase-Nim 的题解,也没写过时间轴分块的题解,所以现在就来写一篇吧(fog 首先考虑最极端的情况,如果图是一条链,并且链的一个端点是 \(1\),那 ...
- BZOJ 3729: Gty的游戏 [伪ETT 博弈论]【学习笔记】
题意: 给定一棵有根树,每个节点有一些石子,每次可以将不多于k的石子移动到父节点 修改一个点的石子数,插入一个点,询问某棵子树是否先手必胜 显然是一个阶梯Nim 每次最多取k个,找规律或者观察式子易发 ...
- BZOJ 3729 GTY的游戏
伪ETT? 貌似就是Splay维护dfn = = 我们首先观察这个博弈 这个博弈直接%(l+1)应该还是很显然的 因为先手怎么操作后手一定能保证操作总数取到(l+1) 于是就变成阶梯Nim了 因为对于 ...
- 【BZOJ 3729】3729: Gty的游戏 (Splay维护dfs序+博弈)
未经博主同意不得转载 3729: Gty的游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 448 Solved: 150 Description ...
- [BZOJ3729]Gty的游戏
[BZOJ3729]Gty的游戏 试题描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动 ...
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
- bzoj 3232: 圈地游戏
bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...
- [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...
- [BZOJ 3731] Gty的超级妹子树 (树分块)
[BZOJ 3731] Gty的超级妹子树 (树分块) 题面 给出一棵树(或森林),每个点都有一个值.现在有四种操作 1.查询x子树里>y的值有多少个 2.把点x的值改成y 3.添加一个新节点, ...
随机推荐
- 在DataGridView控件中验证数据输入
实现效果: 知识运用: DataGridView控件的公共事件CellValidating //将System.Windows.Forms.DataGridViewCellValidatingEven ...
- JavaScript 获取对象中第一个属性
使用 Object.keys(object) 可以取出属性名为数组,但会打乱顺序 严格意义上对象中是只有映射关系而没有顺序的,但是在存储结构里是有顺序的,如果想获取存储结构里的第一个属性可以使用for ...
- 原型模式 -- JavaScript语言的灵魂
原型模式就是将原型对象指向创建对象的类,使这些类共享原型对象的方法与属性.JS是基于原型链实现对象之间的继承,是对属性或者方法的共享,而不是对属性和方法的复制. // 图片轮播类 var LoopIm ...
- SC || 解决在git中上传过大文件的问题(如何将提交过的彻底删除
就在我在ddl前续命的时候……不知道怎么想不开,把v2的压力测试的日志(500多M)也往github上传 之前听说过好多因为传了大文件的锅…… 我竟然还想不开的往上传…… 真实又傻又蠢又自闭(T T ...
- 安装 Win7 的系统的时候如何分区
解决方案 在安装Win7的系统的时候,可以使用下面方法进行分区: 1. 在出现同意许可条款,勾选“我接受许可条款(A)”后,点击下一步,然后继续下面操作: 2. 进入分区界面,点击“驱动器选项(高级) ...
- iOS应用架构谈-part1概述
当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: --------------- --------------- ------------ ...
- Java的WatchService文件夹监听遇到的一些问题
打开word文档时会新增一个~$开头的同名文件,关闭时该文件自动删除 修改excel文件时,会新增一个文件名像E56B4610,CBC15610等这样的文件,同时也会产生tmp格式的文件 PPT文件修 ...
- 2018 Python开发者大调查:Python和JavaScript最配?
在2018年秋季,Python软件基金会与JetBrains发起了年度Python开发者调查. 报告的目的是寻找Python领域的新趋势,帮助开发者深入了解2018年Python开发者的现状. 该报告 ...
- Linux异常体系之stubs_offset
转自 http://www.xuebuyuan.com/2208550.html 在ARM V4及V4T以后的大部分处理器中,中断向量表的位置可以有两个位置:一个是0x00000000,另一个是0xf ...
- PAT Basic 1075
1075 链表元素分类 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面.但每一类内部元素的顺序是不能 ...