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.添加一个新节点, ...
随机推荐
- Java语言支持的变量类型有哪几种
Java语言支持的变量类型有: 类变量:独立于方法之外的变量,用 static 修饰. 实例变量:独立于方法之外的变量,不过没有 static 修饰. 局部变量:类的方法中的变量. 实例: publi ...
- 杂项-站点:SharePoint
ylbtech-杂项-门户站点:SharePoint SharePoint Portal Server 2003 是一个门户站点,使得企业能够开发出智能的门户站点,这个站点能够无缝连接到用户.团队和知 ...
- EntityFrameworkCore.MySql
1.点击“工具”->“NuGet包管理器”->“程序包管理器控制台” 分别安装以下几个包 Mysql 版本: Install-Package MySql.Data.EntityFramew ...
- prometheus linux系统告警规则 实例
#prometheus linux系统告警规则 实例 #根据实际情况修改参数 #rules.linux.yml groups: - name: linux rules: - alert: Node-D ...
- 【ABAP系列】SAP ABAP ALV中设置CHECKBOX同时选中事件
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP ALV中设置CHE ...
- 深度探索区块链/基于Gossip的P2P数据分发(4)
一.概述 背书节点模拟执行签名的结果会经过排序服务(Ording service)广播给所有的节点. 它提供的是一种原子广播服务(Atomic Broadcast),即在逻辑上所有节点接收到的消息顺序 ...
- WPF使用Mutex创建单实例程序失效
vs2019 1.引入名称空间 using System.Threading; using System.Runtime.InteropServices; 2.导入dll并声明方法 [DllImpor ...
- [19/05/05-星期日] JDBC(Java DataBase Connectivity,java数据库连接)_mysql基本知识
一.概念 (1).是一种开放源代码的关系型数据库管理系统(RDBMS,Relational Database Management System):目前有很多大公司(新浪.京东.阿里)使用: (2). ...
- jquery点击来回切换
做个笔记偶尔用有时记不住 方法一: <div id="test"> test </div> $('#test').mouseover(function () ...
- linux 阿里云 centos7 环境下安装easymock(一)
一.说一说Easy-mock的使用场景和优点:1.Easy Mock 是一个可视化,并且能快速生成 模拟数据 的持久化服务,2.基于 Swagger 创建项目,以节省手动创建接口的时间,这点也是我搭建 ...