BZOJ 3729 splay维护DFS序+博弈论
思路:
这像是 阶梯Nim之类的东西
我们 直接把sg函数 设成mod(L+1)的
一棵子树 向下的奇数层上的石子xor起来 就是答案
有加点和改值的操作 就splay维护一下
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1000050,inf=0x3f3f3f3f,NULLL=N-1;
int n,m,l,op,xx,yy,zz,cnt;
int sg[N],sg_odd[N],sg_even[N];
int first[N],next[N*2],v[N*2],tot;
int root,fa[N],ch[N][2],deep[N],d[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void push_up(int x){
int lson=ch[x][0],rson=ch[x][1];
d[x]=min(deep[x],min(d[lson],d[rson]));
sg_odd[x]=sg_odd[lson]^sg_odd[rson];
sg_even[x]=sg_even[lson]^sg_even[rson];
if(deep[x]&1)sg_odd[x]^=sg[x];
else sg_even[x]^=sg[x];
}
void rotate(int p){
int q=fa[p],y=fa[q],x=(ch[q][1]==p);
ch[q][x]=ch[p][!x],fa[ch[q][x]]=q;
ch[p][!x]=q,fa[q]=p,fa[p]=y;
if(y)ch[y][ch[y][1]==q]=p;
push_up(q);
}
void splay(int x,int tp){
for(int y;y=fa[x];rotate(x)){
if(y==tp)break;
if(fa[y]!=tp){
if((ch[y][0]==x)^(ch[fa[y]][0]==y))rotate(x);
else rotate(y);
}
}push_up(x);
if(!tp)root=x;
}
void dfs(int x,int y){
if(y)deep[x]=deep[y]+1;
if(root)fa[x]=root,ch[root][1]=x;
splay(x,0);
for(int i=first[x];~i;i=next[i]){
if(v[i]!=y)dfs(v[i],x);
}
}
int find(int x,int y){
if(d[ch[x][0]]<=y)return find(ch[x][0],y);
if(deep[x]<=y)return x;
return find(ch[x][1],y);
}
int main(){
memset(first,-1,sizeof(first));
scanf("%d%d",&n,&l),l++;
for(int i=1;i<=n;i++)scanf("%d",&sg[i]),sg[i]%=l;
for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);
d[0]=deep[0]=inf,deep[1]=1,dfs(1,0);
fa[NULLL]=root,ch[root][1]=NULLL,splay(NULLL,0);
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
scanf("%d",&xx),xx^=cnt;
splay(xx,0);int temp=find(ch[xx][1],deep[xx]),ans=sg[xx];
splay(temp,xx);
if(deep[xx]&1)ans=sg_even[ch[temp][0]];
else ans=sg_odd[ch[temp][0]];
if(!ans)puts("GTY");
else puts("MeiZ"),cnt++;
}
else if(op==2){
scanf("%d%d",&xx,&yy),xx^=cnt,yy^=cnt;
splay(xx,0);sg[xx]=yy%l;push_up(xx);
}
else{
scanf("%d%d%d",&xx,&yy,&zz);
xx^=cnt,yy^=cnt,zz^=cnt;zz%=l;
sg[yy]=zz,deep[yy]=deep[xx]+1;
splay(xx,0),fa[ch[xx][1]]=yy,fa[yy]=xx;
ch[yy][1]=ch[xx][1],ch[xx][1]=yy;
push_up(yy),push_up(xx);
}
}
}
BZOJ 3729 splay维护DFS序+博弈论的更多相关文章
- 【BZOJ 3729】3729: Gty的游戏 (Splay维护dfs序+博弈)
未经博主同意不得转载 3729: Gty的游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 448 Solved: 150 Description ...
- BZOJ3786 星系探索 【Splay维护dfs序】*
BZOJ3786 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均 ...
- bzoj3786星系探索(splay维护dfs序)
Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...
- BZOJ 3991 set维护dfs序
思路: set按照dfn排序 两点之间的距离可以O(logn)算出来 加一个点-> now ans+=dis(pre,now)+dis(now,next)-dis(pre-next); 删一个点 ...
- BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)
题目大意: Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)
题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...
- BZOJ3159决战——树链剖分+非旋转treap(平衡树动态维护dfs序)
题目描述 输入 第一行有三个整数N.M和R,分别表示树的节点数.指令和询问总数,以及X国的据点. 接下来N-1行,每行两个整数X和Y,表示Katharon国的一条道路. 接下来M行,每行描述一个指令或 ...
- CF877E Danil and a Part-time Job 线段树维护dfs序
\(\color{#0066ff}{题目描述}\) 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 ...
- BZOJ 3779 重组病毒 LCT+线段树(维护DFS序)
原题干(由于是权限题我就直接砸出原题干了,要看题意概述的话在下面): Description 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力 ...
随机推荐
- Nginx下修改php.ini后重新加载配置文件命令
修改php.ini后 如,我的 php.ini 文件是放在 /etc/php.ini php 所在目录是 /www/Linux/php-5.2.17 修改 php.ini 后要用 php-fpm 来进 ...
- 02--C编程细节整理(一)
用C语言比较多,这篇是平时攒下的.有些内容在工作后可能会很常见,但是不用容易忘,所以就写篇博客吧. 1. printf的用法 %*可以用来跳过字符,可以用于未知缩进.像下面一样. for ...
- windwo下载完nvm无法执行node
安装node版本管理工具之NVM.安装方法:见链接. window安装完后,下载node后,无法执行node.见图(图片从网上找的). 最后问题原因是,1.nvm安装时,安装目录中存在空格. 解决办法 ...
- SQL增删改
USE sqlxx CREATE TABLE ygb( sid INT, sname VARCHAR(20), sgender VARCHAR(2), sbirthday DATE, semail V ...
- JS 20180415作业
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- bzoj 1293: [SCOI2009]生日礼物 问题转化 + 性质分析 + 滚动数组优化
Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩 ...
- 路飞学城Python-Day151
sprapy框架能够在pycharm中调试的方式 需要在配置文件中加上一个文件,文件的内容为 start.py #!/usr/bin/env python # -*- coding:utf-8 -*- ...
- PHP如何判断一个数组是一维的还是二维的
1.首先我们有一个PHP内置函数 count(); count(array,mode); array是数组,mode默认为0,1是递归的计数 <?php if(count($arr) == co ...
- web内置对象
内置对象,宿主对象,自定义对象的区别? 内置对象: 系统所提供的对象:Object,Array,Math,Date等等. 宿主对象: JS所运行的环境提 ...
- nginx启动、关闭与重启命令
nginx启动 1.启动nginx:./nginx 2.关闭nginx:./nginx -s stop 3.重启nginx:./nginx -s reload