由于查询的是树链的并的信息,同时信息不能高效合并,只能考虑用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. Gym 101889:2017Latin American Regional Programming Contest(寒假自训第14场)

    昨天00.35的CF,4点才上床,今天打的昏沉沉的,WA了无数发. 题目还是满漂亮的. 尚有几题待补. C .Complete Naebbirac's sequence 题意:给定N个数,他们在1到K ...

  2. UE4 C++ Tips

    篇写的是关于UE4的C++方面的小技巧: 1.在构造函数里 //构建组件 RootComponent = CreateDefaultSubobject<USceneComponent>(T ...

  3. (2)Django入门

    web框架:把一个请求拆成几部分,每部分做相同的事 python中常用的框架 1.Django:大而全的框架 2.flask:微框架又叫轻量级的框架 3.Tornado:高性能框架 pycharm创建 ...

  4. js添加select中option

    1.js代码 $("#year").append("<option value="+value的值+">"+内容+"& ...

  5. day16 Hbase day17

    这个HBase学习了第二遍也不是太透彻PS:启动Hbase之前先启动Zookeeper.HDFS.yarn 1. hbase简介(是基于HDFS.相当于是一个缓存层) 1.1. 什么是hbase(列式 ...

  6. day2 python学习

    1.格式化输出 现有一练习需求,问用户的姓名.年龄.工作.爱好 ,然后打印成以下格式 复制代码 ------------ info of Alex Li ----------- Name : Alex ...

  7. DevExpress使用方法GridControl总结

    1.隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值 sValue=Table.Rows[gri ...

  8. C 语言中的 switch 语句 case 后面是否需要加大括号

    事件原由为编辑器的自动缩进,当 case 换行后不自动缩进. 于是在在想可以可否在 case 后面再大括号,让其自动缩进. 查了资料,发现 case 是可以加大括号的,相当于代码块. 而且还有另外一个 ...

  9. openstack--5--控制节点和计算节点安装配置nova

    Nova相关介绍 目前的Nova主要由API,Compute,Conductor,Scheduler组成 Compute:用来交互并管理虚拟机的生命周期: Scheduler:从可用池中根据各种策略选 ...

  10. [转] VS2017 打包安装程序

    前言 C#写好一个应用程序,总想分享给自己的朋友或者上架,然而被困在打包之外,这次为大家带来近期我的经验,经过几天的摸索,发现网上的教程并不全面,会给初学者带来很多疑问,这里将做些问题描述与解答. / ...