$分块$

$一个很有趣的技巧$

$在树上选sqrt(n)个关键点,每两个关键点之间的距离<=sqrt(n),每个关键点属于一条链$

$预处理出每两个关键点的bitset$

$每次询问就暴力向上爬,合并bitset$

$由于要查询,所以要手写bitset$

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef unsigned long long ull;
  4. const int bl = , N = 1e5 + ;
  5. ull Num[];
  6. vector<int> G[N];
  7. int n, m, f, bbl, last;
  8. ull Max;
  9. int fa[N][], dep[N], mx[N], w[N], mark[N], top[N], mir[N];
  10. int read() {
  11. int x = , f = ;
  12. char c = getchar();
  13. while(!isdigit(c)) {
  14. if(c == '-') {
  15. f = -;
  16. }
  17. c = getchar();
  18. }
  19. while(isdigit(c)) {
  20. x = x * + c - '';
  21. c = getchar();
  22. }
  23. return x * f;
  24. }
  25. struct Bitset {
  26. int len;
  27. ull s[bl];
  28. void clear() {
  29. for(int i = ; i <= len; ++i) {
  30. s[i] = ;
  31. }
  32. len = ;
  33. }
  34. void operator |= (const Bitset &a) {
  35. len = max(len, a.len);
  36. for(int i = ; i <= len; ++i) {
  37. s[i] |= a.s[i];
  38. }
  39. }
  40. void operator |= (int b) {
  41. len = max(len, b >> );
  42. s[b >> ] |= 1LL << (b & );
  43. }
  44. int num() {
  45. int ret = ;
  46. for(int i = ; i <= len; ++i) {
  47. ret += Num[s[i] >> ] + Num[(s[i] >> ) & ] + Num[(s[i] >> ) & ] + Num[s[i] & ];
  48. }
  49. return ret;
  50. }
  51. int mex() {
  52. for(int i = ; i <= len; ++i) {
  53. if(s[i] != Max) {
  54. for(int j = ; j < ; ++j) {
  55. if(!(s[i] & (1LL << j))) {
  56. return i * + j;
  57. }
  58. }
  59. }
  60. }
  61. }
  62. } b[][], ans;
  63. void dfs(int u) {
  64. mx[u] = dep[u];
  65. for(int i = ; i < G[u].size(); ++i) {
  66. int v = G[u][i];
  67. if(v == fa[u][]) {
  68. continue;
  69. }
  70. fa[v][] = u;
  71. dep[v] = dep[u] + ;
  72. dfs(v);
  73. mx[u] = max(mx[u], mx[v]);
  74. }
  75. if(mx[u] - dep[u] >= bbl || u == ) {
  76. mark[u] = ++mark[];
  77. mir[mark[u]] = u;
  78. mx[u] = ;
  79. }
  80. }
  81. int lca(int u, int v) {
  82. if(dep[u] < dep[v]) {
  83. swap(u, v);
  84. }
  85. int d = dep[u] - dep[v];
  86. for(int i = ; i < ; ++i) {
  87. if(d & ( << i)) {
  88. u = fa[u][i];
  89. }
  90. }
  91. if(u == v) {
  92. return u;
  93. }
  94. for(int i = ; i >= ; --i) {
  95. if(fa[u][i] != fa[v][i]) {
  96. u = fa[u][i];
  97. v = fa[v][i];
  98. }
  99. }
  100. return fa[u][];
  101. }
  102. int main() {
  103. n = read();
  104. m = read();
  105. f = read();
  106. bbl = sqrt(n);
  107. for(int i = ; i < ; ++i) {
  108. Max |= 1LL << i;
  109. }
  110. for(int i = ; i < ; ++i) {
  111. for(int j = ; j < ; ++j) {
  112. if(i & ( << j)) {
  113. ++Num[i];
  114. }
  115. }
  116. }
  117. for(int i = ; i <= n; ++i) {
  118. w[i] = read();
  119. }
  120. for(int i = ; i < n; ++i) {
  121. int u = read(), v = read();
  122. G[u].push_back(v);
  123. G[v].push_back(u);
  124. }
  125. dep[] = ;
  126. dfs();
  127. for(int j = ; j <= ; ++j) {
  128. for(int i = ; i <= n; ++i) {
  129. fa[i][j] = fa[fa[i][j - ]][j - ];
  130. }
  131. }
  132. for(int i = ; i <= mark[]; ++i) {
  133. ans.clear();
  134. ans |= w[mir[i]];
  135. int x;
  136. b[i][i] |= w[mir[i]];
  137. for(x = fa[mir[i]][]; x; x = fa[x][]) {
  138. ans |= w[x];
  139. if(mark[x]) {
  140. b[i][mark[x]] = ans;
  141. if(!top[mir[i]]) {
  142. top[mir[i]] = x;
  143. }
  144. }
  145. }
  146. }
  147. while(m--) {
  148. int a = read(), x, y, z;
  149. ans.clear();
  150. while(a--) {
  151. x = read();
  152. y = read();
  153. if(f) {
  154. x = x ^ last;
  155. y = y ^ last;
  156. }
  157. ans |= w[x];
  158. ans |= w[y];
  159. z = lca(x, y);
  160. for(; x && !mark[x] && dep[x] > z; x = fa[x][]) {
  161. ans |= w[x];
  162. }
  163. for(; y && !mark[y] && dep[y] > z; y = fa[y][]) {
  164. ans |= w[y];
  165. }
  166. int xx, yy;
  167. for(xx = x; dep[top[xx]] >= dep[z]; xx = top[xx]);
  168. for(yy = y; dep[top[yy]] >= dep[z]; yy = top[yy]);
  169. ans |= b[mark[x]][mark[xx]];
  170. ans |= b[mark[y]][mark[yy]];
  171. for(x = xx; dep[x] >= dep[z]; x = fa[x][]) {
  172. ans |= w[x];
  173. }
  174. for(y = yy; dep[y] >= dep[z]; y = fa[y][]) {
  175. ans |= w[y];
  176. }
  177. }
  178. int ta = ans.num(), tb = ans.mex();
  179. last = ta + tb;
  180. printf("%d %d\n", ta, tb);
  181. }
  182. return ;
  183. }

bzoj4763的更多相关文章

  1. 「BZOJ4763」雪辉

    「BZOJ4763」天野雪辉 题目大意:有一棵 \(n\) 个点的树,树上每一个点有权值 \(a_i \leq 30000\) ,每次询问给出若干路径,求出这些路径的并上面的不同颜色数与 \(mex\ ...

  2. [bzoj4763]雪辉&[bzoj4812][Ynoi2017]由乃打扑克

    来自FallDream的博客,未经允许,请勿转载,谢谢. cut掉部分题面. 给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex mex就是一个集合中最小的没有 ...

  3. Bzoj4763 雪辉

    Time Limit: 39 Sec  Memory Limit: 666 MBSubmit: 151  Solved: 80 Description 上次立下的NOIP退役Flag没有成功   这次 ...

  4. bzoj2589: Spoj 10707 Count on a tree II

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor lastans和v这两个节点间有多少种不同的点权.其中lastans是上一个询问的答案,初 ...

随机推荐

  1. 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)

    [0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是 ...

  2. liunx 安装工具总结

    1  下载相关文件,比如hadoop 2  解压文件 tar -zxcf xxx.tar.gz 3  mv xxx 到指定目录:通常安装到/usr/local 或者自己建个目录 /usr/develo ...

  3. 1194: [HNOI2006]潘多拉的盒子

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 464  Solved: 221[Submit][Stat ...

  4. HTML 学习笔记 JQuery(animation)

    动画效果也是JQuery库吸引人的地方,通过JQuery的动画方法,能够轻松的为网页天假非常紧菜的视觉效果. show()方法和hide()方法 show()方法和hide()方法是JQuery中最基 ...

  5. hdoj 1116 Play on Words 【并查集】+【欧拉路】

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. while 循环中的break continue pass 的用法

    while break:跳出最近的循环 continue:跳到最近所在循环的开头处 pass:什么也不做,只是空占位语句,它本身与循环没什么关系,但属于简单的单个单词语句的范畴: pass 语句是无运 ...

  7. springmvc fastjson 反序列化时间格式化

    第一种情况是从后台拿到数据,进行反序列化,反序列化格式时间:试了一下很多网上的方法,最后发现还是在实体类上面的日期字段加上如下注解,可以完成格式化操作,否则默认就都是时间戳的格式: @JSONFiel ...

  8. camera报错经典问题

    --- 33u>: error: undefined reference to 'NSFeature::RAWSensorInfo<22133u>::impGetDefaultDat ...

  9. Contiki 2.7 Makefile 文件(一)

    一.主控Makefile 这里以hello-world例子为主线,从其工程Makefile开始,解析整个build过程.

  10. Vue.js devtool插件安装后无法使用的解决办法

    初次使用Vue.js devtool插件的新人在安装了Vue.js devtool插件后,都会经常有一个疑问.我在chrome浏览器里面已经成功安装好Vue.js devtool插件,怎么点击后提示v ...