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

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

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

#include<cstdio>
#include<cstring>
const int M=,N=,N4=N*,B=;
char buf[M*],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
typedef unsigned int bits[N];
void _or(bits a,bits b){for(int i=;i<N;i+=)b[i]|=a[i],b[i+]|=a[i+];}
void _set(bits a,int x){a[x>>]|=<<x;}
int n,m,la=,es[*M],enx[*M],e0[M],ep=,v[M];
int fa[M],sz[M],top[M],dep[M],son[M];
bits ans;
void f1(int w,int pa){
dep[w]=dep[fa[w]=pa]+;
sz[w]=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=pa){
f1(u,w);
sz[w]+=sz[u];
if(sz[u]>sz[son[w]])son[w]=u;
}
}
}
void f2(int w,int tp){
top[w]=tp;
if(son[w])f2(son[w],tp);
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=fa[w]&&u!=son[w])f2(u,u);
}
}
int lca(int x,int y){
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]>dep[b])x=fa[a],a=top[x];
else y=fa[b],b=top[y];
}
return dep[x]<dep[y]?x:y;
}
void maxs(int&a,int b){if(a<b)a=b;}
int id[M],idp=,md[M],rt[M],fas[M/B][],deps[M],e1[M];
bits st[M/B][];
void f5(int w){
for(int i=e1[w];i;i=enx[i]){
int u=es[i];
deps[u]=deps[w]+;
f5(u);
}
}
void f4(int w){
id[w]=idp;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=fa[w]&&!id[u])f4(u);
}
}
void f3(int w){
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=fa[w]){
f3(u);
if(!id[u])maxs(md[w],md[u]+);
}
}
if(w==||md[w]==B){
rt[++idp]=w;
f4(w);
}
}
int log_2[M];
void cal(int x,int y){
int D=deps[id[x]]-deps[id[y]]-;
if(D<=){
_set(ans,v[y]);
while(x!=y)_set(ans,v[x]),x=fa[x];
return;
}
int a=rt[id[x]];
while(x!=a)_set(ans,v[x]),x=fa[x];
x=id[x];
int d=log_2[D];
_or(st[x][d],ans);
D-=<<d;
if(D){
for(int i=;i<;++i)if(D>>i&)x=fas[x][i];
_or(st[x][d],ans);
}
x=rt[fas[x][d]];
while(x!=y)x=fa[x],_set(ans,v[x]);
}
int ls[],rs[],ms[][];
int pw[][];
int xs[N4+];
int _cal(bits x,int k){
int s=,xp=;
for(int i=;i<N;++i){
xs[xp]=x[i]&;
xs[xp+]=x[i]>>&;
xs[xp+]=x[i]>>&;
xs[xp+]=x[i]>>&;
xp+=;
}
for(int i=,d=;i<N4;++i){
while(xs[i]==)++i,d+=;
s+=pw[k][ls[xs[i]]+d];
s+=ms[k][xs[i]];
d=rs[xs[i]];
}
return s;
}
int main(){
fread(buf,,sizeof(buf),stdin)[buf]=;
for(int i=;i<=;++i)pw[][i]=;
for(int t=;t<=;++t)
for(int i=;i<=;++i)pw[t][i]=pw[t-][i]*i;
for(int i=;i<;++i){
int vs[],vp=;
for(int a=,b=;a<;a=b){
b=a;
if(~i>>a&){
++b;
continue;
}
while(i>>b&)++b;
vs[vp++]=b-a;
}
if(i&)ls[i]=vs[];
if(i>>&)rs[i]=vs[vp-];
for(int j=(i&);j<vp-(i>>&);++j){
for(int k=;k<=;++k)ms[k][i]+=pw[k][vs[j]];
}
}
n=_();m=_();
for(int i=;i<=n;++i)v[i]=_();
for(int i=,a,b;i<n;++i){
a=_();b=_();
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
f1(,);f2(,);
f3();
for(int i=;i<=idp;++i){
int w=rt[i],u=fa[rt[fas[i][]=id[fa[rt[i]]]]];
while(w!=u)_set(st[i][],v[w]),w=fa[w];
}
for(int i=;i<;++i){
for(int j=;j<=idp;++j){
int k=fas[j][i-];
if(fas[j][i]=fas[k][i-]){
memcpy(st[j][i],st[j][i-],sizeof(bits));
_or(st[k][i-],st[j][i]);
}
}
}
log_2[]=-;
for(int i=;i<=idp;++i){
log_2[i]=log_2[i>>]+;
if(fas[i][]){
int a=fas[i][];
es[ep]=i;enx[ep]=e1[a];e1[a]=ep++;
}
}
f5(idp);
while(m--){
memset(ans,,sizeof(ans));
for(int c=_();c;--c){
int x=_()^la,y=_()^la,z=lca(x,y);
cal(x,z);
cal(y,z);
}
printf("%u\n",la=_cal(ans,_()));
}
return ;
}

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. Bi-shoe and Phi-shoe

    欧拉函数中的性质 Φ(p)=p-1,p为素数.所以这个题算是贪心+数论吧.每个Φ(p)=p-1:只要从p开始,找素数,那么一定有Φ(k)>=p-1;只有当p=k时,等号成立. #include ...

  2. Linux中ctrl+z,ctrl+d和ctrl+c的区别

    Ctrl-c Kill foreground processCtrl-z Suspend foreground processCtrl-d Terminate input, or exit shell

  3. 2017.4.28 KVM 内存虚拟化及其实现

    概述 KVM(Kernel Virtual Machine) , 作为开源的内核虚拟机,越来越受到 IBM,Redhat,HP,Intel 等各大公司的大力支持,基于 KVM 的开源虚拟化生态系统也日 ...

  4. ODOO v10.0 自动生成财务凭证的科目设置

    ODOO v10.0 自动生成财务凭证的科目设置 可以在产品类别及产品档案里设置,建议在产品类别下设置,方便维护. 项目 设置为(具体科目以公司科目表为主) 对应作用业务 Income Account ...

  5. PS学习之小猪佩奇身上纹,掌声送给社会人

    首先准备素材 用ps首先打开素材一 首先对图片去色 快捷键:shift+Ctrl+u 调整色阶 设置高斯模糊: 另存为psd格式,命名为叠加的对象 再次打开素材一,把佩奇拖入到图层里,并调整大小,旋转 ...

  6. wget命令的使用

    wget是在命令行下载文件的命令 -c 断点续传,用于大文件的下载或者网络不稳定的情况下,一般不写也可以 -P 指定下载到那个目录(是大写的P) 举例 [root@bogon local]# wget ...

  7. 05基于python玩转人工智能最火框架之TensorFlow基础知识

    从helloworld开始 mkdir mooc # 新建一个mooc文件夹 cd mooc mkdir 1.helloworld # 新建一个helloworld文件夹 cd 1.helloworl ...

  8. Atheros AR9285坑爹网卡仅仅有54M/65M,开启150M速率的方法

    版权声明:Max Sky 原创文章.转载时请保留全部权并以超链接形式标明文章出处.否则将追究相关法律责任. https://blog.csdn.net/maxsky/article/details/3 ...

  9. C# to IL 12 Arrays(数组)

    An array is a contiguous block of memory that stores values of the same type. These valuesare an ind ...

  10. 对象的释放Dispose和Close对比

    C#内存释放的几个方法对比: 而Close与Dispose这两种方法的区别在于,调用完了对象的Close方法后,此对象有可能被重新进行使用:而Dispose方法来说,此对象所占有的资源需要被标记为无用 ...