来自FallDream的博客,未经允许,请勿转载,谢谢。


著名游戏设计师vfleaking,最近迷上了Nim。普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取。谁不能取谁输。这个游戏是有必胜策略的。于是vfleaking决定写一个玩Nim游戏的平台来坑玩家。

为了设计漂亮一点的初始局面,vfleaking用以下方式来找灵感:拿出很多石子,把它们聚成一堆一堆的,对每一堆编号1,2,3,4,...n,在堆与堆间连边,没有自环与重边,从任意堆到任意堆都只有唯一一条路径可到达。然后他不停地进行如下操作:

1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家。
2.把堆v中的石子数变为k。

由于vfleaking太懒了,他懒得自己动手了。请写个程序帮帮他吧。

n,m<=500000

这道题其实就是在问你链上点的权值异或和是否为0

考虑求出dfs序之后用线段树维护每个点到根的路径的异或和,这样修改只要改一个区间就好了。

#include<iostream>
#include<cstdio>
#define MN 500000
#define MD 19
using namespace std;
inline int read()
{int x = 0 , f = 1; char ch = getchar();while(ch < '0' || ch > '9'){ if(ch == '-') f = -1;  ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f;
}int n,nl[MN+5],nr[MN+5],head[MN+5],dep[MN+5],p[MN+5],cnt=0,dn=0,S[MN+5],s[MN+5],fa[MD+1][MN+5];
struct edge{int to,next;}e[MN*2+5];
struct Tree{int l,r,x,val;}T[MN*4+5];
inline void ins(int f,int t)
{e[++cnt]=(edge){t,head[f]};head[f]=cnt;e[++cnt]=(edge){f,head[t]};head[t]=cnt;
}void build(int x,int l,int r)
{if((T[x].l=l)==(T[x].r=r)){T[x].x=S[p[l]];return;}int mid=l+r>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);
}void modify(int x,int l,int r,int v)
{if(l==T[x].l&&T[x].r==r){T[x].x^=v;return;}int mid=T[x].l+T[x].r>>1;if(r<=mid) modify(x<<1,l,r,v);else if(l>mid) modify(x<<1|1,l,r,v);else modify(x<<1,l,mid,v),modify(x<<1|1,mid+1,r,v);
}int query(int x,int k)
{if(T[x].l==T[x].r) return T[x].x;int mid=T[x].l+T[x].r>>1;if(k<=mid) return query(x<<1,k)^T[x].x;else return query(x<<1|1,k)^T[x].x;
}void dfs(int x)
{p[nl[x]=++dn]=x;for(int i=head[x];i;i=e[i].next)if(e[i].to!=fa[0][x]){fa[0][e[i].to]=x;S[e[i].to]^=S[x];dep[e[i].to]=dep[x]+1;dfs(e[i].to);}nr[x]=dn;
}
int lca(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);for(int k=dep[x]-dep[y],j=0;k;k>>=1,++j)if(k&1) x=fa[j][x];if(x==y) return x;for(int i=MD;~i;--i)if(fa[i][x]!=fa[i][y])x=fa[i][x],y=fa[i][y];return fa[0][x];
}
char op[5];
int main()
{n=read();for(int i=1;i<=n;i++) S[i]=s[i]=read();for(int i=1;i<n;i++) ins(read(),read());dfs(1);build(1,1,n);for(int i=1;i<=MD;i++)for(int j=1;j<=n;j++)fa[i][j]=fa[i-1][fa[i-1][j]];int q=read();for(int i=1;i<=q;i++){scanf("%s",op+1);int x=read(),y=read();if(op[1]=='Q') {int L=lca(x,y);int ans=query(1,nl[x])^query(1,nl[y])^s[L];puts(ans?"Yes":"No");}else modify(1,nl[x],nr[x],s[x]^y),s[x]=y;}return 0;
}

转载于:https://www.cnblogs.com/FallDream/p/bzoj2819.html

[bzoj2819]Nim相关推荐

  1. bzoj2819: Nim(博弈+树剖)

    2819: Nim 题目:传送门 题解: 很久之前学博弈的时候看过的一道水题,其实算不上博弈吧... 直接套上一个裸的树剖啊,把路径上的点值全都xor(xor满足结合率所以就不管那么多随便搞啦) do ...

  2. BZOJ2819 Nim

    做法...就不讲了,参见hzwer的blog好了 我们发现只要维护树上点到根的xor值就可以了,于是先搞个dfs序,然后用树状数组维护即可. 反正各种调不出...各种WA 后来发现又是LCA的姿势不对 ...

  3. BZOJ2819 Nim(DFS序)

    题目:单点修改.树链查询. 可以直接用树链剖分做.. 修改是O(QlogN),查询是O(QlogNlogN),Q=N=500000: 听说会超时.. 这题也可以用DFS序来做. 先不看修改,单单查询: ...

  4. 2019.5.summary

    2019.5.1 CF C. Prefix Sum Primes 感觉CF就是训练妳如何养成对题目强大的YY能力的QAQ 我们构造 如果只有一种,没辙,只能这样放 否则先放一个2,再放一个1 接下来把 ...

  5. 【BZOJ2819】Nim 树状数组+LCA

    [BZOJ2819]Nim Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可 ...

  6. 【bzoj3150】 cqoi2013—新Nim游戏

    www.lydsy.com/JudgeOnline/problem.php?id=3105 (题目链接) 题意 在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿 ...

  7. LeetCode实战:Nim 游戏

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 You are pla ...

  8. 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. POJ 1704 Georgia and Bob (Nim游戏变形)

    题目:http://poj.org/problem?id=1704 思路:Nim游戏策略,做如下转换,如果N是偶数,则两两配对,将两个数之间的格子数(距离)看做成这一堆石头的数量. 如果N是奇数,则将 ...

  10. BZOJ 3105:[cqoi2013]新Nim游戏

    BZOJ 3105:[cqoi2013]新Nim游戏 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题目大意:在传统的Nim取石子 ...

最新文章

  1. 基于SSM+Layui+Bootstrap实现学校教师技能大赛评分系统
  2. 皮一皮:男女的不同...
  3. Telnet 对memcached进行数据操作
  4. find文件,tar打包和打包压缩
  5. 解密所有APP运行过程中的内部逻辑
  6. struts2自动接收表单数据
  7. 基于顺序存储结构的图书信息表的排序(C++)
  8. 火车票售票系统mysql_今日开售!2020元旦火车票可以买了,春运首日车票也快了→...
  9. POJ3261 Milk Patterns 【后缀数组】
  10. 基于大数据平台的数据仓库
  11. 基于李雅普诺夫函数的跟踪控制(一)
  12. CSS-margin外边距
  13. 秒速五厘米(为情怀而补的题)
  14. app_process 自定义类似am pm命令
  15. Facial Emotion Recognition: State of the Art Performance on FER2013
  16. 程序员眼中的 Eclipse
  17. 使用ExpandableListView中的一些边边角角
  18. SQL考点之SQL查询、SQL支持数据类型(设计大题)
  19. TRIZ创新方法——特性传递
  20. python基于PHP+MySQL的综合排课系统

热门文章

  1. 阿里云,并不是比谁聪明,而是更早面临那些疼痛
  2. Google 元素定制 T 恤
  3. 大数据数学基础 python描述下载_正版 大数据数学基础(Python语言描述)Python 大数据 数学 高职-计算机-大数据技术...
  4. eclipse中export 的jar file与 runnable jar file的区别
  5. 通过xib创建控制器
  6. mysql导入超大sql文件方法
  7. [转载]从零开始学习OpenGL ES之五 – 材质
  8. 常用数据类型使用转换详解
  9. 海洋CMS v6.53 v6.54命令执行
  10. k8s踩坑记第2篇--3个IP折磨人的故事