[BZOJ3729]Gty的游戏/[JZOJ4759]石子游戏
来源:互联网 发布:21天学通c语言视频 编辑:程序博客网 时间:2024/05/29 08:52
题目大意
一棵树,初始时有
保证任何时候节点的编号和个数都不超过
题目分析
NIM的一些姿势
首先是如何解决移动不超过
接着解决将石子移动到父亲的问题,其实这就是一个阶梯
各种乱搞
现在问题变为如何在支持插入和修改的情况下,维护子树的
一个很显然的想法是使用
但是我
具体怎么实现呢?对一棵树,我们求出
时间复杂度
代码实现
出题人不遵守约定,点数可能超过
#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <cctype>#include <cmath>using namespace std;int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}const int N=100050;const int M=N<<1;int a[N],fa[N],last[N],DFN[N],size[N],nim[N][2],anc[N],add[N],mod[N][2],deep[N],tc[N];int n,q,lim,tot,mdcnt,bs,idx,lst,tid;int next[M],tov[M];int SG(int x){return x%(lim+1);}void insert(int x,int y){tov[++tot]=y,next[tot]=last[x],last[x]=tot;}void dfs(int x){ size[x]=1,DFN[x]=++idx,anc[x]=0; nim[DFN[x]][deep[x]&1]=SG(a[x]),nim[DFN[x]][(deep[x]&1)^1]=0; for (int i=last[x],y;i;i=next[i]) if ((y=tov[i])!=fa[x]) fa[y]=x,deep[y]=deep[x]+1,dfs(y),size[x]+=size[y];}void pre(){for (int i=1;i<=idx;i++) nim[i][0]^=nim[i-1][0],nim[i][1]^=nim[i-1][1];}int brute(int x,int og){ int ret=(((deep[x]&1)!=(deep[og]&1))&&x!=og)?SG(a[x]):0; for (int i=last[x],y;i;i=next[i]) if ((y=tov[i])!=fa[x]) ret^=brute(y,og); return ret;}bool win(int x){ tid++; int sg; if (anc[x]) sg=brute(x,x); else { sg=nim[DFN[x]+size[x]-1][(deep[x]&1)^1]^nim[DFN[x]][(deep[x]&1)^1]; for (int i=1;i<=add[0];i++) if (DFN[x]<=DFN[anc[add[i]]]&&DFN[anc[add[i]]]<=DFN[x]+size[x]-1&&((deep[x]&1)!=(deep[add[i]]&1))) sg^=SG(a[add[i]]); for (int p,i=mdcnt;i;i--) if (tc[p=mod[i][0]]!=tid) { tc[p]=tid; if (p!=x&&((deep[x]&1)!=(deep[p]&1))&&(anc[p]&&DFN[x]<=DFN[anc[p]]&&DFN[anc[p]]<=DFN[x]+size[x]-1||!anc[p]&&DFN[x]<=DFN[p]&&DFN[p]<=DFN[x]+size[x]-1)) sg^=SG(a[p])^SG(mod[i][1]); } } return sg;}void rebuild(){ for (int i=1;i<=mdcnt;i++) a[mod[i][0]]=mod[i][1]; mdcnt=0,add[0]=0; idx=0,deep[1]=1,dfs(1),pre();}int main(){ freopen("game.in","r",stdin),freopen("game.out","w",stdout); n=read(),lim=read(); for (int i=1;i<=n;i++) a[i]=read(); for (int i=1,x,y;i<n;i++) { x=read(),y=read(); insert(x,y),insert(y,x); } idx=0,deep[1]=1,dfs(1),pre(); q=read(),bs=trunc(sqrt(q))+1,lst=0,tid=0; for (int i=1,t,u,v,x;i<=q;i++) { t=read(); switch (t) { case 1: { x=read()^lst; if (win(x)) printf("Yes\n"),lst++; else printf("No\n"); break; } case 2: { u=read()^lst,x=read()^lst; mod[++mdcnt][0]=u,mod[mdcnt][1]=x; break; }; case 3: { u=read()^lst,v=read()^lst,x=read()^lst; fa[v]=u,a[v]=x,deep[v]=deep[u]+1,anc[v]=anc[u]?anc[u]:u,insert(u,v); add[++add[0]]=v; } } if (add[0]+mdcnt==bs) rebuild(); } fclose(stdin),fclose(stdout); return 0;}
- [BZOJ3729]Gty的游戏/[JZOJ4759]石子游戏
- BZOJ3729: Gty的游戏
- [bzoj3729]Gty的游戏
- [bzoj3729]Gty的游戏
- [bzoj3729]Gty的游戏
- bzoj3729 Gty的游戏
- BZOJ3729: Gty的游戏
- JZOJ4759. 石子游戏
- 【bzoj3729】【GTY的游戏】【阶梯博弈+splay】
- 【BZOJ3729】Gty的游戏,博弈+splay
- [BZOJ3729]Gty的游戏(博弈论+Splay)
- [BZOJ3729]Gty的游戏(dfs序+splay)
- [博弈 && Splay维护DFS序]BZOJ3729 .Gty的游戏
- BZOJ 3729 Gty的游戏
- BZOJ 3729: Gty的游戏
- [Splay] BZOJ 3729 Gty的游戏
- 石子游戏
- 石子游戏
- Day28、进程的管理(创建、退出)、子进程
- this与super有什么区别
- 2016ACM暑假集训总结
- Mysql学习笔记(一)
- sap模板
- [BZOJ3729]Gty的游戏/[JZOJ4759]石子游戏
- 小球随机出现在屏幕
- electron
- 跑马灯demo
- 母版页
- JRE8 打包瘦身
- poj 1659 Frogs' Neighborhood(贪心Havel-Hakimi可构造简单图定理)
- NodeJS爬虫系统
- Bloom Filter --海量数据过滤的发动机