由于查询的是树链的并的信息,同时信息不能高效合并,只能考虑用bitset维护,小范围暴力预处理以便从bitset算出答案

对树分块,保证每块是连通的且直径较小,对分出的块缩点建新树,在新树上建树上ST表,用bitset保存信息,于是每条链只需用4个bitset合并,再暴力加上零散部分

考虑到bitset的复杂度非常高,分块部分有很大的调整空间,不会成为瓶颈

  1. #include<cstdio>
  2. #include<cstring>
  3. const int M=,N=,N4=N*,B=;
  4. char buf[M*],*ptr=buf-;
  5. int _(){
  6. int x=,c=*++ptr;
  7. while(c<)c=*++ptr;
  8. while(c>)x=x*+c-,c=*++ptr;
  9. return x;
  10. }
  11. typedef unsigned int bits[N];
  12. void _or(bits a,bits b){for(int i=;i<N;i+=)b[i]|=a[i],b[i+]|=a[i+];}
  13. void _set(bits a,int x){a[x>>]|=<<x;}
  14. int n,m,la=,es[*M],enx[*M],e0[M],ep=,v[M];
  15. int fa[M],sz[M],top[M],dep[M],son[M];
  16. bits ans;
  17. void f1(int w,int pa){
  18. dep[w]=dep[fa[w]=pa]+;
  19. sz[w]=;
  20. for(int i=e0[w];i;i=enx[i]){
  21. int u=es[i];
  22. if(u!=pa){
  23. f1(u,w);
  24. sz[w]+=sz[u];
  25. if(sz[u]>sz[son[w]])son[w]=u;
  26. }
  27. }
  28. }
  29. void f2(int w,int tp){
  30. top[w]=tp;
  31. if(son[w])f2(son[w],tp);
  32. for(int i=e0[w];i;i=enx[i]){
  33. int u=es[i];
  34. if(u!=fa[w]&&u!=son[w])f2(u,u);
  35. }
  36. }
  37. int lca(int x,int y){
  38. int a=top[x],b=top[y];
  39. while(a!=b){
  40. if(dep[a]>dep[b])x=fa[a],a=top[x];
  41. else y=fa[b],b=top[y];
  42. }
  43. return dep[x]<dep[y]?x:y;
  44. }
  45. void maxs(int&a,int b){if(a<b)a=b;}
  46. int id[M],idp=,md[M],rt[M],fas[M/B][],deps[M],e1[M];
  47. bits st[M/B][];
  48. void f5(int w){
  49. for(int i=e1[w];i;i=enx[i]){
  50. int u=es[i];
  51. deps[u]=deps[w]+;
  52. f5(u);
  53. }
  54. }
  55. void f4(int w){
  56. id[w]=idp;
  57. for(int i=e0[w];i;i=enx[i]){
  58. int u=es[i];
  59. if(u!=fa[w]&&!id[u])f4(u);
  60. }
  61. }
  62. void f3(int w){
  63. for(int i=e0[w];i;i=enx[i]){
  64. int u=es[i];
  65. if(u!=fa[w]){
  66. f3(u);
  67. if(!id[u])maxs(md[w],md[u]+);
  68. }
  69. }
  70. if(w==||md[w]==B){
  71. rt[++idp]=w;
  72. f4(w);
  73. }
  74. }
  75. int log_2[M];
  76. void cal(int x,int y){
  77. int D=deps[id[x]]-deps[id[y]]-;
  78. if(D<=){
  79. _set(ans,v[y]);
  80. while(x!=y)_set(ans,v[x]),x=fa[x];
  81. return;
  82. }
  83. int a=rt[id[x]];
  84. while(x!=a)_set(ans,v[x]),x=fa[x];
  85. x=id[x];
  86. int d=log_2[D];
  87. _or(st[x][d],ans);
  88. D-=<<d;
  89. if(D){
  90. for(int i=;i<;++i)if(D>>i&)x=fas[x][i];
  91. _or(st[x][d],ans);
  92. }
  93. x=rt[fas[x][d]];
  94. while(x!=y)x=fa[x],_set(ans,v[x]);
  95. }
  96. int ls[],rs[],ms[][];
  97. int pw[][];
  98. int xs[N4+];
  99. int _cal(bits x,int k){
  100. int s=,xp=;
  101. for(int i=;i<N;++i){
  102. xs[xp]=x[i]&;
  103. xs[xp+]=x[i]>>&;
  104. xs[xp+]=x[i]>>&;
  105. xs[xp+]=x[i]>>&;
  106. xp+=;
  107. }
  108. for(int i=,d=;i<N4;++i){
  109. while(xs[i]==)++i,d+=;
  110. s+=pw[k][ls[xs[i]]+d];
  111. s+=ms[k][xs[i]];
  112. d=rs[xs[i]];
  113. }
  114. return s;
  115. }
  116. int main(){
  117. fread(buf,,sizeof(buf),stdin)[buf]=;
  118. for(int i=;i<=;++i)pw[][i]=;
  119. for(int t=;t<=;++t)
  120. for(int i=;i<=;++i)pw[t][i]=pw[t-][i]*i;
  121. for(int i=;i<;++i){
  122. int vs[],vp=;
  123. for(int a=,b=;a<;a=b){
  124. b=a;
  125. if(~i>>a&){
  126. ++b;
  127. continue;
  128. }
  129. while(i>>b&)++b;
  130. vs[vp++]=b-a;
  131. }
  132. if(i&)ls[i]=vs[];
  133. if(i>>&)rs[i]=vs[vp-];
  134. for(int j=(i&);j<vp-(i>>&);++j){
  135. for(int k=;k<=;++k)ms[k][i]+=pw[k][vs[j]];
  136. }
  137. }
  138. n=_();m=_();
  139. for(int i=;i<=n;++i)v[i]=_();
  140. for(int i=,a,b;i<n;++i){
  141. a=_();b=_();
  142. es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
  143. es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
  144. }
  145. f1(,);f2(,);
  146. f3();
  147. for(int i=;i<=idp;++i){
  148. int w=rt[i],u=fa[rt[fas[i][]=id[fa[rt[i]]]]];
  149. while(w!=u)_set(st[i][],v[w]),w=fa[w];
  150. }
  151. for(int i=;i<;++i){
  152. for(int j=;j<=idp;++j){
  153. int k=fas[j][i-];
  154. if(fas[j][i]=fas[k][i-]){
  155. memcpy(st[j][i],st[j][i-],sizeof(bits));
  156. _or(st[k][i-],st[j][i]);
  157. }
  158. }
  159. }
  160. log_2[]=-;
  161. for(int i=;i<=idp;++i){
  162. log_2[i]=log_2[i>>]+;
  163. if(fas[i][]){
  164. int a=fas[i][];
  165. es[ep]=i;enx[ep]=e1[a];e1[a]=ep++;
  166. }
  167. }
  168. f5(idp);
  169. while(m--){
  170. memset(ans,,sizeof(ans));
  171. for(int c=_();c;--c){
  172. int x=_()^la,y=_()^la,z=lca(x,y);
  173. cal(x,z);
  174. cal(y,z);
  175. }
  176. printf("%u\n",la=_cal(ans,_()));
  177. }
  178. return ;
  179. }

bzoj4812: [Ynoi2017]由乃打扑克的更多相关文章

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

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

  2. 洛谷P3603 || bzoj 4763 雪辉 && bzoj4812: [Ynoi2017]由乃打扑克

    https://www.luogu.org/problemnew/show/P3603 https://www.lydsy.com/JudgeOnline/problem.php?id=4763 就是 ...

  3. java和h5 canvas德州扑克开发中(二)

    德州扑克网页源码在github上分享 https://github.com/lxr1907/pokers 感兴趣的可以上去看下. 1.通讯使用websocket,主要在message.js中. 2.用 ...

  4. java和h5 canvas德州扑克开发中(一)

    先附上我的德州扑克测试地址 http://120.26.217.116:8080/LxrTexas/texasIndex.html 我和一个朋友的德州扑克历时一个多月开发,目前已经基本可玩. 前端主要 ...

  5. 德州扑克AI WEB版

    继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼.哈哈,估计只有自己能玩了 这两天重构了一下界面,基于web服务器和浏览器来交互. 服务器和客户端之间用websocket通信, ...

  6. 德州扑克AI实现 TexasHoldem Poker

    参考了一下这篇文献,http://cowboyprogramming.com/2007/01/04/programming-poker-ai/ 自己用go实现了一个德州扑克AI,效果还可以. 正常和它 ...

  7. 第一篇代码 嗨翻C语言 21点扑克

    /* *  计算牌面点数的程序. *  使用“拉斯难加斯公开许可证”. *  学院21点扑克游戏小组. */#include <stdio.h>#include <stdlib.h& ...

  8. [swustoj 1088] 德州扑克

    德州扑克(1088) 问题描述 德州扑克是一款风靡全球的扑克游戏.德州扑克一共有52张牌,没有王牌.每个玩家分两张牌作为“底牌”,五张由荷官陆续朝上发出的作为公共牌.开始的时候,每个玩家会有两张面朝下 ...

  9. 2015华为德州扑克入境摘要——软体project

    直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是. 我们的团队一直共同拥有3民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...

随机推荐

  1. SEO:网站优化内容

    一.内部优化 (1)meta标签优化:例如:TDK等的优化:        首页:网站名称 或者 网站名称_提供服务介绍or产品介绍 .        频道页:频道名称_网站名称.        文章 ...

  2. django 基于form表单上传文件和基于ajax上传文件

    一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...

  3. C++学习(七)(C语言部分)之 输入

    输入学习时的笔记(其实也没什么用,留着给自己看的) 输出是指 把内容打印到控制台窗口 输入是指 把内容输入到程序里 scanfscanf 从键盘获取内容到程序里格式占位符+变量要加取地址符 1.格式占 ...

  4. java依赖注入(injection)

    和SpringSource分别通过其开源项目Guice及Spring Framework提供了依赖注入的功能.然而直到现在开发者也没有一种标准的.独立于供应商的方式从而无需修改其源文件就能在这些框架之 ...

  5. linux系统lnmp环境包搬家教程

    打包搬家apt-get install zip unzip -yyum install zip unzip -y# debian ubuntu 用apt-get,centos用yumcd /home/ ...

  6. MySQL--线程池(Thread Pool)

    ================================================================= 线程池技术 在MySQL社区版中,MySQL使用one-thread ...

  7. Cassandra--设置数据保留时间

    在Cassandra中,可以设置列的保留时间(Time To Live),当该列超过保留时间后,会下一次读取中被墓碑(Tombstone)标记,然后保留一个垃圾回收周期(表属性gc_grace_sec ...

  8. oracle之 AWR固定基线

    前言:可以创建AWR基线来为数据库建立已保存的工作负载视图,以便以后用来与其他AWR快照进行比较. 1. 手工创建 AWR 固定基线(固定基线如果没有设置过期时间,会永久保存) -- 根据时间创建DB ...

  9. hbase java 基本例子

    一下代码实用  0.99.0 以后的版本. package hadoop; import java.io.IOException; import java.util.ArrayList; import ...

  10. windows python监听文件触发脚本

    from watchdog.events import * class FileEventHandler(FileSystemEventHandler): def __init__(self): Fi ...