BZOJ 3729 GTY的游戏
伪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的游戏的更多相关文章
- BZOJ 3729 - Gty的游戏(Staircase 博弈+时间轴分块)
题面传送门 介于自己以前既没有写过 Staircase-Nim 的题解,也没写过时间轴分块的题解,所以现在就来写一篇吧(fog 首先考虑最极端的情况,如果图是一条链,并且链的一个端点是 \(1\),那 ...
- BZOJ 3729: Gty的游戏 [伪ETT 博弈论]【学习笔记】
题意: 给定一棵有根树,每个节点有一些石子,每次可以将不多于k的石子移动到父节点 修改一个点的石子数,插入一个点,询问某棵子树是否先手必胜 显然是一个阶梯Nim 每次最多取k个,找规律或者观察式子易发 ...
- BZOJ 3729 Gty的游戏 ——Splay
很久很久之前,看到Treap,好深啊 很久之前看到Splay,这数据结构太神了. 之后学习了LCT. 然后看到Top-Tree就更觉得神奇了. 知道我见到了这题, 万物基于Splay 显然需要维护子树 ...
- 【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.添加一个新节点, ...
随机推荐
- Spring整合Hibernate实现Spring Data JPA (介绍和使用)
Spring Data JPA是Spring基于Hibernate开发的一个JPA框架.如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便. 但是Sprin ...
- Hyperledger交易流程
Hyperledger Fabric Network中的角色 在Hyperledger中,由三种类型的角色: Client:应用客户端,用于将终端用户的交易请求发送到区块链网络: Peers:负责维护 ...
- Linux驱动开发7——I/O内存分配
CPU通过物理地址访问DDR和外设,DDR内存称为物理内存地址空间,外设寄存器组称为I/O内存地址空间. ARM采用统一编址,而X86采用独立编制.上一章介绍了DDR内存分配,这一章介绍I/O内存分配 ...
- 四、robotframework生成几种随机数
1.random()生成0<=n<1之间的随机实数--它会生成一个随机的浮点数,范围是在0.0~1.0之间.: ${num} evaluate random.random() ra ...
- 009-elasticsearch5.4.3【三】搜索概述-查询模型、分页、ES数据类型
一.概述 1.查询模型 搜索API允许用户执行搜索查询并返回与查询匹配的搜索匹配.它可以跨一个或多个索引以及跨一种或多种类型执行.可以使用查询Java API提供查询.搜索请求的主体是使用Search ...
- 003-js-MD5
源码 /* global define */ ;(function ($) { 'use strict' /* * Add integers, wrapping at 2^32. This uses ...
- fiddler模拟弱网操作
弱网是app测试需要覆盖的一种场景 目录 1.认识弱网 2.fiddler模拟弱网配置 3.弱网下可能发生的问题 1.认识弱网 弱网.2G.3G建议的上下行速率如下,同时还可以控制丢包率的数据 网络 ...
- c# 解决Socket问题——由于目标机器积极拒绝,无法连接
关于单机出现这种问题不多赘述,主要阐述服务机和客户机出现这种问题的解决办法. 1.检查防火墙 这种问题出现的最多,特别是你的服务机还是买的各家的云产品,比如阿里云就是到防火墙中添加出入站规则,Azur ...
- Mac 设置git命令tab自动补全(亲测有效)
转载 :https://blog.csdn.net/tiancaijyy/article/details/84888868 注意: 获取git-completion.bash 要对应自己的git版本 ...
- 05.vue-resource的基本使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...