2819: Nim

题目:传送门


题解:

   很久之前学博弈的时候看过的一道水题,其实算不上博弈吧...

   直接套上一个裸的树剖啊,把路径上的点值全都xor(xor满足结合率所以就不管那么多随便搞啦)

   dog B 肉老师,竟然不告诉我它卡常,搞得我TLE几百年

  


代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<iostream>
  7. using namespace std;
  8. inline int read()
  9. {
  10. int f=,x=;char ch;
  11. while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
  12. while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
  13. return f*x;
  14. }
  15. struct node
  16. {
  17. int x,y,next;
  18. }a[];int len,last[];
  19. inline void ins(int x,int y)
  20. {
  21. len++;a[len].x=x;a[len].y=y;
  22. a[len].next=last[x];last[x]=len;
  23. }
  24. struct trnode
  25. {
  26. int l,r,c,lc,rc;
  27. }tr[];int trlen;
  28. inline void bt(int l,int r)
  29. {
  30. int now=++trlen;
  31. tr[now].l=l;tr[now].r=r;tr[now].c=;
  32. tr[now].lc=tr[now].rc=-;
  33. if(l<r)
  34. {
  35. int mid=(tr[now].l+tr[now].r)/;
  36. tr[now].lc=trlen+;bt(l,mid);
  37. tr[now].rc=trlen+;bt(mid+,r);
  38. }
  39. }
  40. inline void change(int now,int p,int c)
  41. {
  42. if(tr[now].l==tr[now].r){tr[now].c=c;return ;}
  43. int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/;
  44. if(p<=mid)change(lc,p,c);
  45. else change(rc,p,c);
  46. tr[now].c=tr[lc].c^tr[rc].c;
  47. }
  48. inline int getsum(int now,int l,int r)
  49. {
  50. if(tr[now].l==l && r==tr[now].r)return tr[now].c;
  51. int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/;
  52. if(r<=mid)return getsum(lc,l,r);
  53. else if(mid+<=l)return getsum(rc,l,r);
  54. return getsum(lc,l,mid)^getsum(rc,mid+,r);
  55. }
  56. int n,fa[],son[],dep[],tot[];
  57. inline void pre_tree_node(int x)
  58. {
  59. son[x]=;tot[x]=;
  60. for(register int k=last[x];k;k=a[k].next)
  61. {
  62. int y=a[k].y;
  63. if(y!=fa[x])
  64. {
  65. dep[y]=dep[x]+;
  66. fa[y]=x;
  67. pre_tree_node(y);
  68. if(tot[y]>tot[son[x]])son[x]=y;
  69. tot[x]+=tot[y];
  70. }
  71. }
  72. }
  73. int top[],ys[],id,tp;
  74. inline void pre_tree_edge(int x)
  75. {
  76. int tt=tp;top[x]=tp;ys[x]=++id;
  77. if(son[x]!=)pre_tree_edge(son[x]);
  78. for(register int k=last[x];k;k=a[k].next)
  79. {
  80. int y=a[k].y;
  81. if(y!=son[x] && y!=fa[x])
  82. {
  83. tp=y;
  84. pre_tree_edge(y);
  85. tp=tt;
  86. }
  87. }
  88. }
  89. int sol(int x,int y)
  90. {
  91. int ans=,tx=top[x],ty=top[y];
  92. while(tx!=ty)
  93. {
  94. if(dep[tx]>dep[ty])swap(tx,ty),swap(x,y);
  95. ans^=getsum(,ys[ty],ys[y]);
  96. y=fa[ty];ty=top[y];
  97. }
  98. if(x==y)return ans^getsum(,ys[x],ys[x]);
  99. else
  100. {
  101. if(dep[x]>dep[y])swap(x,y);
  102. return ans^getsum(,ys[x],ys[y]);
  103. }
  104. }
  105. int st[],Q;
  106. char s[];
  107. int main()
  108. {
  109. //freopen("a.in","r",stdin);freopen("a.out","w",stdout);
  110. n=read();for(int i=;i<=n;++i)st[i]=read();
  111. len=;memset(last,,sizeof(last));
  112. for(register int i=;i<n;++i)
  113. {
  114. int x=read(),y=read();
  115. ins(x,y);ins(y,x);
  116. }
  117. fa[]=;dep[]=;pre_tree_node();
  118. id=;tp=;pre_tree_edge();
  119. trlen=;bt(,id);
  120. for(register int i=;i<=n;++i)change(,ys[i],st[i]);
  121. Q=read();
  122. while(Q--)
  123. {
  124. scanf("%s",s+);int x=read(),y=read();
  125. if(s[]=='Q')
  126. {
  127. if(sol(x,y)!=)printf("Yes\n");
  128. else printf("No\n");
  129. }
  130. else change(,ys[x],y);
  131. }
  132. return ;
  133. }

bzoj2819: Nim(博弈+树剖)的更多相关文章

  1. BZOJ:2819 NIM(树链剖分||DFS序 &&NIM博弈)

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

  2. BZOJ2819: Nim 树链剖分

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

  3. bzoj2819 Nim

    题意:给定一棵带点权的树,每次询问用一条路径上的点玩Nim游戏先手是否必胜,支持单点修改. Nim游戏:所有堆的数目异或起来不为0时先手必胜,否则必败. 所以就是单点修改+路径异或和查询. 树剖一发, ...

  4. 博弈论中的Nim博弈

    瞎扯 \(orzorz\) \(cdx\) 聚聚给我们讲了博弈论.我要没学上了,祝各位新年快乐.现在让我讲课我都不知道讲什么,我会的东西大家都会,太菜了太菜了. 马上就要回去上文化课了,今明还是收下尾 ...

  5. Atcoder #017 agc017 D.Game on Tree 树上NIM 博弈

    LINK 题意:树上NIM的模板题,给出一颗树,现有操作删去端点不为根节点的边,其另一端节点都将被移除,不能取者为败 思路:一看就是个NIM博弈题,只是搬到树上进行,树上DFS进行异或 记得#014D ...

  6. BZOJ2819 Nim 【dfn序 + lca + 博弈论】

    题目 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的. ...

  7. HDU 2509 Nim博弈变形

    1.HDU 2509  2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...

  8. HDU 1907 Nim博弈变形

    1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...

  9. 【61测试】【dp】【二分】【前缀和】【树剖】

    不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...

随机推荐

  1. Spring Boot (16) logback和access日志

    Spring Boot 内部采用的是Commons Logging进行日志记录,但是在底层为Java Util Logging.Log4J2.Logback等日志框架提供了默认配置. logback ...

  2. SQLServer 里的三种条件判断的用法:Where GroupBy Having

    HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似.WHERE 子句搜索条件在进行分组操作之前应用:而 HAVING 搜索条件在进行分组 ...

  3. AFN上传多张图片

    AFN上传多张图片代码: AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; sessionManager.r ...

  4. Activity生命周期(待整理)

    1. 定义 有一些方法共同定义生命周期,如下图示:(图片来自于官网文档) 2. onStart()——在Activity即将对用户可见之前调用 (1)Activity启动动画.二维动画在onStart ...

  5. 算法之dfs篇

    dfs算法是深度搜索算法.从某一节点开始遍历直至到路径底部,如果不是所寻找的,则回溯到上个节点后,再遍历其他路径.不断重复这个过程.一般此过程消耗很大,需要一些优化才能保持算法的高效. hdu1010 ...

  6. 【Linux】计划任务管理crontab、at

    一.计划任务管理 —— crontab 1. crontab 命令 •  按照预先设置的时间周期(分钟.小时.天…… )重复执行用户指定的命令操作,属于周期性计划任务,默认打开“/var/spool/ ...

  7. MySQL 优化之 index_merge (索引合并)

    深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...

  8. 【MySQL】ERROR 1005: Can't create table (errno: 150)的错误解决办法

    在mysql 中建立引用约束的时候会出现MySQL ERROR 1005: Can't create table (errno: 150)的错误信息结果是不能建立 引用约束. 出现问题的大致情况 1. ...

  9. iOS安全策略之HTTPS

    1.HTTPS传输流程 2.常用加密算法 3.AFN证书校验策略及核心方法 4.SSL Pinning 5.CA证书申请流程 HTTPS经由超文本传输协议进行通信,但利用SSL/TLS来对数据包进行加 ...

  10. 洛谷P1025 数的划分【dp】

    将整数nn分成kk份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7n=7,k=3k=3,下面三种分法被认为是相同的. 1,1,51,1,5; 1,5,11,5,1; 5,1,15, ...