[bzoj2819]Nim

news/2024/9/8 5:55:11/

Description

给出一棵树,每次修改一个点的值或询问x,y之间的路径上的数组成的石子游戏先手有没有必胜方案。(普通版SG)
n,m<=5*10^5

Solution

哎呀,dfs带一个参过~(≧▽≦)/~啦啦啦
虽然很对不起vfleaking爷,但是我也懒得改人工栈了。(受我深情一拜)
先来科(kou)普(hu)一下,先手必胜就是这条路径上的数的异或和不为0.
似乎刚开始想到了链剖,但是两个log的复杂度似乎过不了。
于是我们考虑直接维护前缀异或和,答案就是sg[x]^sg[y]^a[lca(x,y)]。
因为异或两次会抵消。
然后,我们每次修改会影响的只有x和它的子树。
那就可以用dfs序来维护了。
由于本蒟蒻很讨厌用bfs来求dfs序,于是就碾过去了。
可以用线段树打区间异或标记,单点查询。
也可以利用树状数组的前缀和功能,先把询问查分,然后把每个询问区间的修改变成两次单点修改。
你喜欢就好

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define rep(i,a) for(int i=last[a];i;i=next[i])
#define N 500005
using namespace std;
int n,m,x,y,l,tot,a[N],f[N][19],d[N],sg[N],in[N],out[N];
int t[N*2],next[N*2],last[N];
char s[1];
void add(int x,int y) {t[++l]=y;next[l]=last[x];last[x]=l;
}
void change(int x,int v) {for(;x<=n;x+=x&-x) sg[x]^=v;
}
int find(int x) {int ans=0;for(;x;x-=x&-x) ans^=sg[x];return ans;
}
void dfs(int x) {fo(j,1,18) f[x][j]=f[f[x][j-1]][j-1];in[x]=++tot;rep(i,x) if (t[i]!=f[x][0]) {f[t[i]][0]=x;d[t[i]]=d[x]+1;dfs(t[i]);}out[x]=tot;
}
int lca(int x,int y) {if (d[x]<d[y]) swap(x,y);fd(j,18,0) if (d[f[x][j]]>d[y]) x=f[x][j];if (d[x]!=d[y]) x=f[x][0];fd(j,18,0) if (f[x][j]!=f[y][j]) x=f[x][j],y=f[y][j];if (x!=y) return f[x][0];else return x;
}
int main() {scanf("%d",&n);fo(i,1,n) scanf("%d",&a[i]);fo(i,1,n-1) scanf("%d%d",&x,&y),add(x,y),add(y,x);d[1]=1;dfs(1);fo(i,1,n) change(in[i],a[i]),change(out[i]+1,a[i]);for(scanf("%d",&m);m;m--) {scanf("%s%d%d",s,&x,&y);if (s[0]=='Q') {int z=lca(x,y);if (find(in[x])^find(in[y])^a[z]) printf("Yes\n");else printf("No\n");} else {change(in[x],a[x]),change(out[x]+1,a[x]);a[x]=y;change(in[x],a[x]),change(out[x]+1,a[x]);}}
}

http://www.ppmy.cn/news/486243.html

相关文章

图像处理总结:Canny边缘检测(二)

前言 上节已经讲了图像处理中Canny边缘检测算法原理 https://blog.csdn.net/Aidam_Bo/article/details/86099421 这节主要依据原理&#xff0c;代码佐证 话不多说&#xff0c;直接上码 一、源码 #include <opencv2\opencv.hpp> #include <iostream> #include …

JAVA7 NIO2基础

为什么80%的码农都做不了架构师&#xff1f;>>> package com.mime;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java…

NOI1.12 (02)

02:短信计费 总时间限制: 1000ms 内存限制: 65536kB 描述 用手机发短信&#xff0c;一条短信资费为0.1元&#xff0c;但限定一条短信的内容在70个字以内&#xff08;包括70个字&#xff09;。如果你一次所发送的短信超过了70个字&#xff0c;则会按照每70个字一条短信的限…

2.JNI

JNI注册 静态注册和动态注册 动态注册的实现 c JNIEXPORT jint JNICALL JNI_Onload(JavaVM *vm , void *reserved){} System.load()和System.loadLibrary()区别 System.load()必须是全路径 绝对路径 System.loadLibrary() 参数为文件名 JNIEnv 代表Java环境 通过JNIEnv*…

UI自动化测试-Selenium的使用

文章目录 1. 环境搭建1.1 入门示例1.2 元素操作常用方法1.3 浏览器操作常用方法1.4 获取元素信息常用方法1.5 鼠标操作常用方法1.6 键盘操作常用方法1.7 下拉选择框操作2. 元素定位2.1 id定位2.2 name定位2.3 class_name定位2.4 tag_name定位2.5 link_text定位2.6 partail_link…

Nyoj 252

dp[k]&#xff0c;表示长度为k满足题目条件的‘01’串&#xff0c;有几个。如果第k位为0&#xff0c;则dp[k] dp[k-1],如果第k位为1,那么第k-1位一定为0&#xff0c;则dp[k] dp[k-2]; #include <iostream> #include <cstring> #include <cstdio>using name…

.NET开源类库Nini手册(INI、XML、注册表的配置应用)-中文翻译

目录 1.简介1.1什么是应用程序配置数据&#xff1f;1.2问题1.3介绍Nini 2.入门2.1一个简单的例子2.2默认值2.3设置、保存和删除键2.4添加和删除配置2.5键值扩展 3.高级主题3.1合并3.2价值别名3.3键值清单3.4活动 4.配置类型4.1 Ini文件4.2 XML文件4.3 Windows注册表配置4.4 .NE…

Java NIO.2

Java NIO.2 NIO.2Path&#xff0c; Paths&#xff0c; FilesFileVisitorWatchService文件属性 NIO.2 Java7 对NIO进行了改进&#xff1a; 新增java.nio.file 包&#xff0c;提供全面的文件IO和文件系统访问&#xff1b;基于异步Channel的IO&#xff0c;在java.nio.channels下…

【BZOJ 2819】 Nim

2819: Nim Time Limit: 20 Sec Memory Limit: 128 MB Submit: 926 Solved: 355 [ Submit][ Status] Description 著名游戏设计师vfleaking&#xff0c;最近迷上了Nim。普通的Nim游戏为&#xff1a;两个人进行游戏&#xff0c;N堆石子&#xff0c;每回合可以取其中某一堆的任…

NIO2.0

JDK1.7升级了NIO类库&#xff0c;升级后的NIO类库被称为NIO2.0&#xff0c;引人注目的是&#xff0c;Java正式提供了异步文件I/O操作&#xff0c;同时提供了与UNIX网络编程事件驱动I/O对应的AIO。 NIO2.0引入了新的异步通道的概念&#xff0c;并提供了异步文件通道和异步套…

Java学习笔记-第十四章-NIO与NIO2

目录 一、NIO二、NIO21. NIO2架构2. 操作路径3. 属性读取与设定4. 操作文档与记录5. 读取/访问目录6. 过滤/搜索文档 一、NIO /*** 原始的dump** param inputStream* param outputStream*/public static void dump(InputStream inputStream, OutputStream outputStream) throw…

Java NIO2

http://developer.51cto.com/art/200911/165703.htm http://developer.51cto.com/art/201112/307728.htm 整理自《Pro Java 7 NIO.2》 1 Path类 1.1 Path类介绍 1.2 定义一个Path 1.3 获取Path属性 1.4 转换Path 1.5 拼接Path 1.6 在两个位置间转换Path 1.7 比较两个Path 1.8 …

bzoj3105【CQOI2013】新Nim游戏

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 791 Solved: 461 [ Submit][ Status][ Discuss] Description 传统的Nim游戏是这样的&#xff1a;有一些火柴堆&#xff0c;每堆都有若干根火柴&#xff08;不同堆的火柴数量可以不同&#xff0…

21.01.22 NO.27

问题 B: 图书管理员 题目描述 图书馆中每本书都有一个图书编码&#xff0c;可以用于快速检索图书&#xff0c;这个图书编码是一个正整数。 每位借书的读者手中有一个需求码&#xff0c;这个需求码也是一个正整数。如果一本书的图书编码恰好以读者的需求码结尾&#xff0c;那么这…

nini

nini 是一个用来解析 INI配置文件的C#库&#xff0c;支持中文编码。 主页&#xff1a;http://nini.sourceforge.net

欢迎来到 VOXEL WARS!

Sandbox Streams 的全新节目&#xff0c;我们希望你们能参与其中&#xff01; 我们正在寻找 15 名 Voxedit 艺术家&#xff0c;他们将需要抽出 1 小时进行现场表演&#xff08;仅限屏幕共享&#xff09;&#xff0c;并在节奏快速的环境中进行创作&#xff0c;以赢得“最佳快速设…

结合符号性记忆,清华等提出ChatDB,提升大模型的复杂推理能力

结合符号性记忆&#xff0c;清华等提出ChatDB&#xff0c;提升大模型的复杂推理能力 随着大语言模型&#xff08;Large Language Models&#xff09;的爆火&#xff0c;例如 ChatGPT&#xff0c;GPT-4&#xff0c;PaLM&#xff0c;LLaMA 等&#xff0c;如何让大语言模型更好的…

100种思维模型之马斯洛需求层次理论-81

马斯洛需求层次理论是人本主义科学理论之一&#xff0c;由美国心理学家亚伯拉罕马斯洛在1943年在《人类激励理论》论文中所提出。 文中将人类需求像阶梯一样从低到高按层次分为五种&#xff0c;分别是&#xff1a;生理需求、安全需求、社交需求、尊重需求和自我实现需求。 一、…

python儿童教程-02

Python基础语法 接下来我们来学习Python的基础语法&#xff0c;包括变量、数据类型、运算符、条件语句、循环语句等。 &#xff08;1&#xff09;变量 在Python中&#xff0c;变量是用来存储数据的。Python的变量不需要声明&#xff0c;直接赋值即可。例如&#xff1a; x …

对TS里接口、extends和类的理解

对TS里接口和类的理解 接口 需求: 创建人的对象, 需要对人的属性进行一定的约束 下面通过一个简单示例来观察接口是如何工作的&#xff1a; /* 在 TypeScript 中&#xff0c;我们使用接口&#xff08;Interfaces&#xff09;来定义对象的类型 接口: 是对象的状态(属性)和行…