由于查询的是树链的并的信息,同时信息不能高效合并,只能考虑用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. 自定义video样式

    和朋友聊天说到了video自定义样式问题,今天抽空简单试验了一下,下面贴上代码. dom结构如下: <video id="video1" width="399&qu ...

  2. ZOJ 1007:Numerical Summation of a Series(数学)

    Numerical Summation of a Series Time Limit: 10 Seconds      Memory Limit: 32768 KB      Special Judg ...

  3. Python逻辑运算

    一.运算符种类 1.比较运算符 > ,< , >= ,<= , != , == 2.赋值运算符 =, +=,-=,*=,/=,**=,%= 3.成员运算符 in not in ...

  4. python selenium自动化点击页面链接测试

    python selenium自动化点击页面链接测试 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回 ...

  5. Java 枚举(enum) 详解4种常见的用法

    JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 大师兄我又加上自己的理解,来帮助各位理解一下. 用法一:常量 在JDK1.5 之前,我们定义常 ...

  6. 【mybatis源码学习】调试mybatis的第一个程序

    [一].基础知识准备 mybatis-config.xml配置文件的结构 MyBatis配置文件中大标签configuration下子标签包括: configuration |--- properti ...

  7. Next.js v4.1.4 文档中文翻译【转载】

    最近想稍稍看下 React的 SSR框架 Next.js,因为不想看二手资料, 所以自己跑到 Github上看,Next.js的文档是英文的,看倒是大概也能看得懂, 但有些地方不太确定,而且英文看着毕 ...

  8. shell-url-decode

    查询每个小时的clk ,然后获取对应的字段 #!/bin/bash urldecode(){ echo -e "$(sed 's/+/ /g;s/%\(..\)/\\x\1/g;')&quo ...

  9. golang xml parent node add attribute without struct

    question: golang  encoding/xml: foo>bar,attr - foo ignored solution: you can replace output resul ...

  10. JQuery城市选择

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...