[BZOJ3729]Gty的游戏(博弈论+Splay)

从ISO 17987到SAE J2602:LIN一致性测试标准全景解读与CANoe实现 本文深入解析了从ISO 17987到SAE J2602的LIN一致性测试标准技术演进,详细对比了两大标准体系的技术差异,并基于Vector CANoe平台演示了如何构建符合最新行业要求的自动化测试方案。文章重点介绍了SAE J2602标准的三大改进点,包括唤醒特性、传输层协议和诊断服务的增强测试要求,并提供了CANoe测试环境配置、测试模块集成及测试案例解析的实战指南。 阅读详情

=== ===

这里放传送门

=== ===

题解

首先看这道题的博弈部分,也就是如何得到答案。对于单个节点来说,这就是一个简单的巴什博弈问题,每次可以拿走[1..L]个的话,只需要把石子个数对L+1取模就可以得到它的SG值了。如果考虑树上操作这就是一个阶梯博弈,每次只需要考虑奇数层上的石子。那么只需要对每棵子树维护它的奇数层SG值和偶数层SG值就可以了。因为有插入节点的操作所以dfs序要用Splay来维护。

这道题里面最关键的操作是插入节点的操作。因为访问子树的时候要知道它的入栈点和出栈点,也就是in和out,而如果插入了一个节点就有可能引起很多节点out值的变化。

一个节点的in显然就是它自己,但out值是它子树里最后一个被遍历的节点,也就是它一定是一个叶子节点。那么如果在某个叶子节点下面接了一个节点,就有至少一个节点的out会变化。而我们可以发现这个寻找out的关系是具有传递性的,比如树上某个节点x把u当做它的out,而u当前的out节点指向新接入的儿子v,那么x的out也应该指向v。这就启示我们可以用并查集来维护这个东西,把每个节点并到它的out上去就可以了。

而为了让修改out的次数尽量少,如果接入新节点的那个父亲不是叶子节点,我们可以通过适当处理让所有节点的out都不变,方法就是把新节点的dfs序紧挨着父节点放在它后面。比如当前有dfs序:u-v-w,v和w都是u的儿子,那么显然u的out是w。如果现在还要给u接一个新儿子x,那么我们可以把dfs序修改成:u-x-v-w,这样的话所有已有节点的in和out都不会变。而如果修改成:u-v-w-x,u的out就变了,就造成了不必要的修改。

代码

#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,L,m,tot,v[100010],p[100010],a[200010],nxt[200010],lastans,deep[100010],num[100010],cnt;
map<int,int>hash;
struct Node{
    Node *ch[2],*fa;
    int Osum,Esum,pos,val;
    Node();
    void count();
    bool pl(){return this==fa->ch[1];}
    Node* Pre();
    Node* Nxt();
}*null,*Root,*in[100010],*out[100010],P[100010];
Node::Node(){ch[0]=ch[1]=fa=null;Osum=Esum=pos=val=0;}
void Node::count(){
    Osum=ch[0]->Osum^ch[1]->Osum;
    Esum=ch[0]->Esum^ch[1]->Esum;
    if (deep[pos]&1) Osum^=val;
    else Esum^=val;
}
Node* Node::Pre(){
    Node *k=this;
    if (ch[0]!=null){
        k=ch[0];
        while (k->ch[1]!=null) k=k->ch[1];
        return k;
    }
    while (k==k->fa->ch[0]) k=k->fa;
    return k->fa;
}
Node* Node::Nxt(){
    Node *k=this;
    if (ch[1]!=null){
        k=ch[1];
        while (k->ch[0]!=null) k=k->ch[0];
        return k;
    }
    while (k==k->fa->ch[1]) k=k->fa;
    return k->fa;
}
void add(int x,int y){
    tot++;a[tot]=y;nxt[tot]=p[x];p[x]=tot;
}
void Rotate(Node *k){
    Node *r=k->fa;
    if (r==null||k==null) return;
    int x=k->pl()^1;
    r->ch[x^1]=k->ch[x];
    if (k->ch[x]!=null)
      r->ch[x^1]->fa=r;
    if (r->fa!=null)
      r->fa->ch[r->pl()]=k;
    else Root=k;
    k->fa=r->fa;
    r->fa=k;
    k->ch[x]=r;
    r->count();k->count();
}
void Splay(Node *r,Node *tar){
    for (;r->fa!=tar;Rotate(r))
      if (r->fa->fa!=tar)
        Rotate(r->pl()==r->fa->pl()?r->fa:r);
}
Node* Find_out(Node *x){
    if (out[x->pos]==x) return out[x->pos];
    out[x->pos]=Find_out(out[x->pos]);
    return out[x->pos];
}
int Getans(Node *x){
    Node *tmp=in[x->pos];
    int num;
    Splay(tmp->Pre(),null);
    tmp=Find_out(x);
    Splay(tmp->Nxt(),Root);
    num=x->pos;
    if (deep[num]&1) return Root->ch[1]->ch[0]->Esum;
    else return Root->ch[1]->ch[0]->Osum;
}
void dfs(int u,int fa){
    deep[u]=deep[fa]+1;
    num[++cnt]=u;
    in[u]=P+u;
    for (int i=p[u];i!=0;i=nxt[i])
      if (a[i]!=fa) dfs(a[i],u);
    out[u]=P+num[cnt];
}
Node *build(int l,int r){
    if (l>r) return null;
    int mid=(l+r)>>1;
    Node *k=P+num[mid];
    if (mid==0||mid==n+1)
      k=new Node();
    k->ch[0]=build(l,mid-1);
    k->ch[1]=build(mid+1,r);
    if (k->ch[0]!=null) k->ch[0]->fa=k;
    if (k->ch[1]!=null) k->ch[1]->fa=k;
    k->count();return k;
}
int main()
{
    null=new Node;*null=Node();
    scanf("%d%d",&n,&L);
    for (int i=1;i<=n;i++){
        int x;scanf("%d",&x);
        x%=(L+1);v[i]=x;
        P[i]=Node();hash[i]=i;
        P[i].pos=i;P[i].val=v[i];
    }
    for (int i=1;i<n;i++){
        int x,y;scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    dfs(1,0);
    Root=build(0,n+1);
    scanf("%d",&m);
    for (int i=1;i<=m;i++){
        int type;scanf("%d",&type);
        switch (type){
            case 1:{
                int v;scanf("%d",&v);
                v^=lastans;
                v=hash[v];
                if (Getans(P+v)==0) printf("GTY\n");
                else{lastans++;printf("MeiZ\n");}
                break;
            }
            case 2:{
                int x,y;scanf("%d%d",&x,&y);
                x^=lastans;y^=lastans;
                x=hash[x];y%=(L+1);
                Splay(in[x]->Pre(),null);
                Splay(in[x]->Nxt(),Root);
                Root->ch[1]->ch[0]->val=y;
                Root->ch[1]->ch[0]->count();
                Root->ch[1]->count();
                Root->count();break;
            }
            case 3:{
                int u,v,x;
                Node *now;
                scanf("%d%d%d",&u,&v,&x);
                u^=lastans;v^=lastans;x^=lastans;
                u=hash[u];v=hash[v]=++n;
                P[v]=Node();now=P+v;
                in[v]=out[v]=now;
                deep[v]=deep[u]+1;//修改deep必须在count之前
                now->pos=v;
                now->val=x%(L+1);
                now->count();
                Splay(in[u],null);
                Splay(in[u]->Nxt(),Root);
                Root->ch[1]->ch[0]=now;
                now->fa=Root->ch[1];
                if (out[u]==in[u]) out[u]=now;//如果父节点是叶子就要修改out
                Root->ch[1]->count();
                Root->count();break;
            }
        }
    }
    return 0;
}

偏偏在最后出现的补充说明

用Splay维护dfs序是常见的思路啦。
常见的博弈模型一定要记牢,很多简单的博弈问题都是直接套模型就可以解决的。

《Zephyr OS 入门与实战》第3章:第一个 Zephyr 程序 - Blinky 实战 解决方法:确认设备树overlay文件已正确加载。返回值,确认驱动初始化状态。 阅读详情

相关推荐

华为S5700三层交换机VLAN配置避坑指南:为什么你的VLAN间无法互通?

本文针对华为S5700三层交换机VLAN间无法互通的典型故障,提供深度排障指南。文章从数据转发原理入手,系统梳理了从物理链路、VLAN配置、VLANIF接口状态、路由表到ARP表、MTU及安全策略等全链路检查点,并给出了清晰的排查命令与流程,帮助网络工程师快速定位并解决VLAN间路由问题,实现稳定互通。

tt34567的博客 873

【BZOJ3729】Gty的游戏,博弈+splay

.

xiaoyimi的博客 539

ST-LINK调试原理与STM32硬件连接实战指南

嵌入式调试器是连接开发环境与物理MCU的核心枢纽,其本质是基于ARM CoreSight架构的实时硬件观测与控制接口。它通过JTAG或SWD协议访问内核寄存器、内存及外设,实现断点、单步、内存监视等深度调试能力,远超简单程序烧录功能。ST-LINK作为主流ARM Cortex-M调试器,支持SWD(2线)与JTAG(多线)双模式,在电平匹配、复位控制、引脚复用规避等硬件层面临关键工程约束。掌握VREF参考电压配置、nSRST硬复位接线、调试引脚隔离策略及Keil MDK调试会话配置,是保障STM32稳定联机

weixin_42596214的博客 312

[BZOJ3729]Gty的游戏(dfs序+splay)

题目描述传送门题目大意:给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略。支持几种操作:1 x询问将x的子树中的石子移动到这个节点先手是否有必胜策略;2 x y将节点x上的石子修改为y;3 x y z在节点x上连接一个节点y(x为y的父亲),石子数为z。强制在线。题解首先考虑静态的树。对于单个点来说,其实是一个巴什

zyf2000 728

基于STM32H750的便携式双通道示波器与信号发生器AFE设计

示波器和信号发生器是电子测量与嵌入式系统调试的基础仪器,其核心在于模拟前端(AFE)对宽动态范围、高精度采样与低失真输出的协同实现。原理上需兼顾输入信号调理(衰减/放大/偏置)、ADC/DAC接口匹配、触发同步及电源完整性设计。技术价值体现在以低成本器件达成±15V输入/±10V输出、16位等效采样精度与85kHz带宽的工程平衡。典型应用场景包括电机驱动波形观测、传感器信号验证、电源环路测试及通信电平分析。本方案聚焦STM32H750平台,深度融合硬件拓扑与片上资源特性,为嵌入式教学与原型开发提供可复现、易

weixin_35755188的博客 108

ADS 使用调整器动态调参教程(Tuning)

ADS动态调参教程

weixin_42845306的博客 1万+

bzoj 3729: Gty的游戏 splay+dfs序+阶梯博弈

题意给定一颗树,初始n个结点,1为根节点。每个结点上有一定的石子数。 现在你需要在线兹瓷三种操作: 1、询问以x为根的子树中进行组合游戏,双方轮流操作,每次操作可以将一个结点(在子树内且不为x)的不超过p个至少1个石子移至其父亲结点。问这个游戏先手是否必胜? 2、修改一个结点的石子数。 3、新建一个结点石子数为x,其父亲设为y(保证y已经建立) n<=10^5分析首先我们要知道这个

beginend 467

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

m0_52031708的博客 3848

【BZOJ】3729: Gty的游戏-博弈论+splay

博弈论,splay

远行客 253

动网格-网格重构之铺层(三)

运动区域可以是边界区域 (Boundary Zone),也可以是单元区域 ( Cell Zone)。指定了体网格再生方法后,FLUENT自动地根据运动区域(dynamic zones)的运动来调整内部节点以再生体网格。必须保留至少一层网格。(4)如果边面的法向和运动方向偏角较大,生成的网格扭斜度会比较大铺层算法不适用于边界形状变化较大的情况。(1)体网格再生方法的选择(Smoothing,Layering,Remeshing);(2)适用网格种类:四边形、六面体、三棱柱(网格的分布要服从一定的规则)。

weixin_44386973的博客 2095

AI Agent Harness与SCADA系统集成

简单来说,AI Agent Harness是Industrial AI Agent的“中央调度室+装备库+知识库+安全网”把不同技术栈、不同部署环境(云/边/端)、不同功能(感知、推理、决策、执行、验证)的“零散Agent”组装成具备特定工业场景能力的Agent Team(如聚合反应根因诊断Agent Team);管理Agent Team的生命周期(创建、初始化、调度、监控、销毁);提供统一的工业多工具调用接口(对接SCADA、MES、PLC、DCS、巡检机器人、数字孪生平台等);内置。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 355

bzoj3729-Gty的游戏【Splay,博弈论】

正题 题目链接:https://darkbzoj.tk/problem/3729 题目大意 给出nnn个点的一棵树,第iii个节点上有aia_iai​个石子,然后每次可以选择不超过LLL个石子移动到父节点处。要求支持操作 以一个节点的子树进行博弈是否有先手必胜 修改一个节点的石子个数 插入一个新的叶子 1≤n,m≤5×104,1≤L≤1091\leq n,m\leq 5\times 10^4,1\leq L\leq 10^91≤n,m≤5×104,1≤L≤109 解题思路 额,首先是阶梯博弈和巴什博

QuantAsk 380

YOLOv8进阶实战:融合SAHI超推理算法,在无人机应用中精准捕捉视频与图片中的微小目标

YOLOv8改进是一种先进的目标检测算法,通过引入辅助超推理算法SAHI推理,使得小目标无法逃避检测。SAHI推理算法结合视频和图片的特点,利用先进的超推理技术,提高了目标检测的准确性和鲁棒性。不仅如此,YOLOv8改进还支持对视频和图片进行实时的目标检测,将检测结果直观地呈现给用户。这一技术的应用范围广泛,可以用于安防领域,提升监控设备的性能和效率;也可以用于无人驾驶领域,实现精准的目标识别和跟踪。总之,YOLOv8改进是一项具有突破性的技术,为目标检测领域带来了重大的进展。

weixin_51988935的博客 807

BZOJ_3729_Gty的游戏_博弈论+splay+dfs序

BZOJ_3729_Gty的游戏_博弈论+splay+dfs序 Description 某一天gty在与他的妹子玩游戏。 妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问 将某个节点的子树中的石子移动到这个节点先手是否有必胜策略。 gty很快计算出了策略。 但gty的妹子十分机智,她决定修改某个节点的石子或加入某个新节点。 ...

135

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

bzoj3729: Gty的游戏【博弈论+splay】

Description 某一天gty在与他的妹子玩游戏。 妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问 将某个节点的子树中的石子移动到这个节点先手是否有必胜策略。 gty很快计算出了策略。 但gty的妹子十分机智,她决定修改某个节点的石子或加入某个新节点。 gty不忍心打击妹子,所以他将这个问题交给了你。 另外由于gty十分绅士,所...

cdsszjj的博客 255

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【BZOJ 3729】3729: Gty的游戏 (Splay维护dfs序+博弈)

未经博主同意不得转载 3729: Gty的游戏 Time Limit:20 SecMemory Limit:128 MBSubmit:448Solved:150 Description 某一天gty在与他的妹子玩游戏。妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子...

weixin_30567225的博客 194

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[bzoj3729][博弈][Splay]Gty的游戏

Description 某一天gty在与他的妹子玩游戏。 妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问 将某个节点的子树中的石子移动到这个节点先手是否有必胜策略。 gty很快计算出了策略。 但gty的妹子十分机智,她决定修改某个节点的石子或加入某个新节点。 gty不忍心打击妹子,所以他将这个问题交给了你。 另外由于gty十分绅士,所以他将先手让...

Rose_max的博客 364

[bzoj3729]Gty的游戏

题目大意给定一颗树,初始n个结点,1为根节点。每个结点上有一定的石子数。 现在你需要在线兹瓷三种操作: 1、询问以x为根的子树中进行组合游戏,双方轮流操作,每次操作可以将一个结点(在子树内且不为x)的不超过p个至少1个石子移至其父亲结点。问这个游戏先手是否必胜? 2、修改一个结点的石子数。 3、新建一个结点石子数为x,其父亲设为y(保证y已经建立)一点姿势我们需要解决以下两个博弈论问题:

不来也不去的一只失忆蝴蝶 1674

【bzoj3729】【GTY的游戏】【阶梯博弈+splay】

Description 某一天gty在与他的妹子玩游戏。 妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问 将某个节点的子树中的石子移动到这个节点先手是否有必胜策略。 gty很快计算出了策略。 但gty的妹子十分机智,她决定修改某个节点的石子或加入某个新节点。 gty不忍心打击妹子,所以他将这个问题交给了你。 另外由于gty十分绅士

sunshinezff的专栏 667

BZOJ 3729 GTY的游戏

伪ETT? 貌似就是Splay维护dfn = = 我们首先观察这个博弈 这个博弈直接%(l+1)应该还是很显然的 因为先手怎么操作后手一定能保证操作总数取到(l+1) 于是就变成阶梯Nim了 因为对于先手从深度奇数点挪到深度偶数点后手接着可以把它挪回深度偶数点 所以就是典型的阶梯Nim 我们可以发现 只需要维护子树到一个点深度差为奇数的点的异或和就可以了 这个操作显然可以对整...

weixin_30332705的博客 113

BZOJ 3729: Gty的游戏

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3729题解:阶梯博弈+splay树维护dfs序列因为splay操作被tle到死code:#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdio&gt; #include &lt;algorithm&gt;...

oWuHen12的博客 383

[Splay] BZOJ 3729 Gty的游戏

" 题解: 博弈论+Splay维护dfs序 想会做这道题首先要知道两个Nim游戏的经典变形。 第一个是加入一次只能选m个的限制。 第二个是“阶梯博弈”(POJ 1704),就是有一个楼梯,每次可以把一阶的任意个棋子移到下面一个台阶,不能移动(0号台阶不能向下移动)的玩家输。 第一个问题的解决方法是把所有的数 mod (m+1),因为显然加入这个限制之后每个子游戏的sg函数值变成了sg(

雯舞 785

【BZOJ3729】Gty的游戏(伸展树+博弈论)

Description某一天gty在与他的妹子玩游戏。 妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问 将某个节点的子树中的石子移动到这个节点先手是否有必胜策略。 gty很快计算出了策略。 但gty的妹子十分机智,她决定修改某个节点的石子或加入某个新节点。 gty不忍心打击妹子,所以他将这个问题交给了你。 另外由于gty十分绅士,所以他将

(■-■) 568

BZOJ3729: Gty的游戏(伪ETT)

题面 传送门 前置芝士 巴什博奕 \(Nim\)游戏的改版,我们现在每次最多只能取走\(k\)个石子,那么\(SG\)函数很容易写出来 \[SG(x)=mex_{i=1}^{\min(x,k)}SG(x-i)\] 有\(SG(0)=0\),用归纳法易知\(SG(x)=x\bmod (k+1)\) 阶梯博弈 有\(n\)级台阶,从\(0\)级开始数到\(n\)级。每级上都有一定的石子。每次可以把一个...

weixin_34238633的博客 161

bzoj 3729: Gty的游戏 (博弈+splay)

3729: Gty的游戏 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 335  Solved: 104 [Submit][Status][Discuss] Description 某一天gty在与他的妹子玩游戏。 妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问 将某个节点的子树

clover_hxy的博客 606
上一篇: [BZOJ2656][ZJOI2012]数列(高精度)
下一篇: [BZOJ4539][Hnoi2016]树(倍增+LCA+主席树)
FromATP
博客等级 码龄10年 75粉丝 163原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值