最近都忙的没空写题解了喵~

看到 1= 终于是保住了也算是一个小小的安慰吧 555……

湖北省队互测题,据说会爆栈,但 Linux 下 栈空间=内存=128M 真的吃不下?

反正我是写了个人工栈~

这似乎是我近 4 天里写的第 3 道树链剖分?

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. const int sizeOfPoint=;
  5. const int sizeOfEdge=;
  6.  
  7. int n, m, q;
  8. int w[sizeOfPoint];
  9. int f[sizeOfPoint], d[sizeOfPoint], s[sizeOfPoint];
  10. int num, idx[sizeOfPoint], top[sizeOfPoint], son[sizeOfPoint];
  11. inline char getch();
  12. inline int getint();
  13. inline void putint(int);
  14.  
  15. struct edge {int point; edge * next;};
  16. edge memory[sizeOfEdge], * port=memory;
  17. edge * e[sizeOfPoint];
  18. inline edge * newedge(int, edge * );
  19. inline void link(int, int);
  20.  
  21. int tot, stack[sizeOfPoint];
  22. edge * t[sizeOfPoint];
  23. inline void dfsTree();
  24. inline void dfsChain();
  25.  
  26. int T[sizeOfPoint<<];
  27. inline void build();
  28. inline void updateItem(int, int);
  29. inline int querySegment(int, int);
  30.  
  31. inline void swap(int & , int & );
  32. inline int queryChain(int, int);
  33.  
  34. int main()
  35. {
  36. char ch;
  37. int u, v;
  38.  
  39. n=getint();
  40. for (int i=;i<=n;i++)
  41. w[i]=getint();
  42. for (int i=;i<n;i++)
  43. {
  44. int u=getint(), v=getint();
  45. link(u, v);
  46. }
  47.  
  48. dfsTree();
  49. dfsChain();
  50. build();
  51.  
  52. q=getint();
  53. for (int i=;i<=q;i++)
  54. {
  55. ch=getch(), u=getint(), v=getint();
  56.  
  57. if (ch=='Q') putint(queryChain(u, v));
  58. else updateItem(idx[u], v);
  59. }
  60.  
  61. return ;
  62. }
  63. inline char getch()
  64. {
  65. register char ch;
  66. do ch=getchar(); while (ch!='Q' && ch!='C');
  67. return ch;
  68. }
  69. inline int getint()
  70. {
  71. register int num=;
  72. register char ch;
  73. do ch=getchar(); while (ch<'' || ch>'');
  74. do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
  75. return num;
  76. }
  77. inline void putint(int num)
  78. {
  79. if (num>) putchar('Y'), putchar('e'), putchar('s');
  80. else putchar('N'), putchar('o');
  81. putchar('\n');
  82. }
  83. inline edge * newedge(int point, edge * next)
  84. {
  85. edge * ret=port++;
  86. ret->point=point; ret->next=next;
  87. return ret;
  88. }
  89. inline void link(int u, int v)
  90. {
  91. e[u]=newedge(v, e[u]); e[v]=newedge(u, e[v]);
  92. }
  93. inline void dfsTree()
  94. {
  95. int u;
  96.  
  97. memcpy(t, e, sizeof(e));
  98. memset(d, 0xFF, sizeof(d)); d[]=;
  99. s[]=;
  100. for (stack[++tot]=;tot; )
  101. {
  102. u=stack[tot];
  103.  
  104. edge *& i=t[u];
  105. for ( ;i && d[i->point]>=;i=i->next);
  106. if (i)
  107. {
  108. stack[++tot]=i->point;
  109. f[i->point]=u;
  110. d[i->point]=d[u]+;
  111. s[i->point]=;
  112. }
  113. else
  114. {
  115. if (!f[u]) break;
  116. s[f[u]]+=s[u];
  117. if (s[u]>s[son[f[u]]])
  118. son[f[u]]=u;
  119. tot--;
  120. }
  121. }
  122. }
  123. inline void dfsChain()
  124. {
  125. int u;
  126.  
  127. memcpy(t, e, sizeof(e));
  128. idx[]=num=; top[]=;
  129. for (stack[++tot]=;tot; )
  130. {
  131. u=stack[tot];
  132. if (son[u] && !idx[son[u]])
  133. {
  134. stack[++tot]=son[u];
  135. idx[son[u]]=++num;
  136. top[son[u]]=top[u];
  137. continue;
  138. }
  139.  
  140. edge *& i=t[u];
  141. for ( ;i && idx[i->point];i=i->next);
  142. if (i)
  143. {
  144. stack[++tot]=i->point;
  145. idx[i->point]=++num;
  146. top[i->point]=i->point;
  147. }
  148. else
  149. {
  150. if (!f[u]) break;
  151. tot--;
  152. }
  153. }
  154. }
  155. inline void build()
  156. {
  157. for (m=;m<n+;m<<=);
  158. for (int i=;i<=n;i++) T[idx[i]+m]=w[i];
  159. for (int i=m;i>=;i--) T[i]=T[i<<]^T[i<<|];
  160. }
  161. inline void updateItem(int i, int t)
  162. {
  163. for (T[i+=m]=t, i>>=;i;i>>=) T[i]=T[i<<]^T[i<<|];
  164. }
  165. inline int querySegment(int l, int r)
  166. {
  167. int sum=;
  168. for (l=l+m-, r=r+m+;l^r^;l>>=, r>>=)
  169. {
  170. if (~l&) sum^=T[l^];
  171. if ( r&) sum^=T[r^];
  172. }
  173. return sum;
  174. }
  175. inline void swap(int & u, int & v)
  176. {
  177. int t=u; u=v; v=t;
  178. }
  179. inline int queryChain(int u, int v)
  180. {
  181. int sum=;
  182. while (top[u]!=top[v])
  183. {
  184. if (d[top[u]]<d[top[v]]) swap(u, v);
  185. sum^=querySegment(idx[top[u]], idx[u]);
  186. u=f[top[u]];
  187. }
  188. if (d[u]>d[v]) swap(u, v);
  189. sum^=querySegment(idx[u], idx[v]);
  190. return sum;
  191. }

1A 好评如潮

[BZOJ 2819]Nim的更多相关文章

  1. [BZOJ - 2819] Nim 【树链剖分 / DFS序】

    题目链接: BZOJ - 2819 题目分析 我们知道,单纯的 Nim 的必胜状态是,各堆石子的数量异或和不为 0 .那么这道题其实就是要求求出树上的两点之间的路径的异或和.要求支持单点修改. 方法一 ...

  2. bzoj 2819 Nim(BIT,dfs序,LCA)

    2819: Nim Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1596  Solved: 597[Submit][Status][Discuss] ...

  3. BZOJ 2819: Nim( nim + DFS序 + 树状数组 + LCA )

    虽然vfleaking好像想卡DFS...但我还是用DFS过了... 路径上的石堆异或和=0就是必败, 否则就是必胜(nim游戏). 这样就变成一个经典问题了, 用DFS序+BIT+LCA就可以在O( ...

  4. [BZOJ 2819]NIM(dfs序维护树上xor值)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2819 分析: 树上的nim游戏,关键就是要判断树上的一条链的异或值是否为0 这个题目有 ...

  5. BZOJ 2819: Nim dfs序维护树状数组,倍增

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

  6. bzoj 2819 Nim dfn序+树状数组维护区间异或值

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

  7. BZOJ 2819 Nim 树链剖分+树状数组

    这题真没什么意思. 不过就是将普通的求Min,Max,求和等东西换成Xor,偏偏Xor还有很多性质. 算是刷道水题吧. #include<iostream> #include<cst ...

  8. bzoj 2819(DFS序+树状数组+博弈+lca)

    2819: Nim Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2045  Solved: 795[Submit][Status][Discuss] ...

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

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

随机推荐

  1. web前端基础篇⑨

    1.web端.app端 目前实现响应式布局,主要用以下两种方式.CSS原生代码响应式布局 @media screen.bootstrap移动设备优先.自带框架. 兼容性 用原生代码的话 根据不同的屏幕 ...

  2. JPA使用入门

    JPA能干什么?我在前面一遍文章<初步了解JPA>基本描述了.不过你不需要点击回去再看.这里简单的再提一下JPA的功能,就是:(1)实现“对象-关系”映射:(2)对象持久化到数据库:(3) ...

  3. ios开发之网络php

    接着前面的学习,几天上午学习了数据库网络值php用户的注册与登录,感觉代码与ios上的oc太相似了,因此学习下来没什么障碍了,下面是代码: 首先是javascript.html文件中: <!DO ...

  4. iOS仿直播带有气泡动画的UIButton

    现在直播软件确实很火,因为需要就写了一个带有动画气泡的按钮,代码中的部分动画有参考到其他童鞋,在这里万分感谢! .h文件 @interface YYBubbleButton : UIButton @p ...

  5. Linux下swoole的安装配置

    前几天搭建swoole环境,在安装php的swoole扩展时不知道什么原因,提示成功,但是使用的时候不能加载,最后决定重新安装php试试,顺便记录了php的安装过程 wget http://cn2.p ...

  6. windows10和ubuntu16.04双系统下时间不对的问题 ZT

    最近装了windows10和ubuntu16.04双系统,仍然出现了喜闻乐见的老问题,装完后,在windows下时区不对,之前的老办法是: sudo gedit /etc/default/rcS ut ...

  7. 常用类String的方法

    String str="hello"; 1.与数组相关的方法 System.out.println(str.length()); System.out.println(str.ch ...

  8. renderman、arnold及全局光照

    走马观花看了一些实现全局光(global illumination)的文章,都是非实时电影级的.的确可以分为两个阵营,一是pixar的renderman中常用的reyes+点云,感觉pixar一路走来 ...

  9. Android SDK Manager中不显示未下载的api解决方案

    Android SDK 在线更新镜像服务器资源用户评价:  / 14 Android SDK 在线更新镜像服务器资源:大连东软信息学院镜像服务器地址:http://mirrors.neusoft.ed ...

  10. linux磁盘存储命令 磁盘存储命令

    硬盘空间是一个有限的资源, 硬盘空间是一个有限的资源,用户用下面的命令 可 以随时了解当前硬盘空间的使用情况. 以随时了解当前硬盘空间的使用情况.   ? du,df命令 查看磁盘空间状况的操作 , ...