bzoj4812: [Ynoi2017]由乃打扑克
由于查询的是树链的并的信息,同时信息不能高效合并,只能考虑用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]由乃打扑克的更多相关文章
- [bzoj4763]雪辉&[bzoj4812][Ynoi2017]由乃打扑克
来自FallDream的博客,未经允许,请勿转载,谢谢. cut掉部分题面. 给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex mex就是一个集合中最小的没有 ...
- 洛谷P3603 || bzoj 4763 雪辉 && bzoj4812: [Ynoi2017]由乃打扑克
https://www.luogu.org/problemnew/show/P3603 https://www.lydsy.com/JudgeOnline/problem.php?id=4763 就是 ...
- java和h5 canvas德州扑克开发中(二)
德州扑克网页源码在github上分享 https://github.com/lxr1907/pokers 感兴趣的可以上去看下. 1.通讯使用websocket,主要在message.js中. 2.用 ...
- java和h5 canvas德州扑克开发中(一)
先附上我的德州扑克测试地址 http://120.26.217.116:8080/LxrTexas/texasIndex.html 我和一个朋友的德州扑克历时一个多月开发,目前已经基本可玩. 前端主要 ...
- 德州扑克AI WEB版
继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼.哈哈,估计只有自己能玩了 这两天重构了一下界面,基于web服务器和浏览器来交互. 服务器和客户端之间用websocket通信, ...
- 德州扑克AI实现 TexasHoldem Poker
参考了一下这篇文献,http://cowboyprogramming.com/2007/01/04/programming-poker-ai/ 自己用go实现了一个德州扑克AI,效果还可以. 正常和它 ...
- 第一篇代码 嗨翻C语言 21点扑克
/* * 计算牌面点数的程序. * 使用“拉斯难加斯公开许可证”. * 学院21点扑克游戏小组. */#include <stdio.h>#include <stdlib.h& ...
- [swustoj 1088] 德州扑克
德州扑克(1088) 问题描述 德州扑克是一款风靡全球的扑克游戏.德州扑克一共有52张牌,没有王牌.每个玩家分两张牌作为“底牌”,五张由荷官陆续朝上发出的作为公共牌.开始的时候,每个玩家会有两张面朝下 ...
- 2015华为德州扑克入境摘要——软体project
直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是. 我们的团队一直共同拥有3民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...
随机推荐
- 洛谷P4147 玉蟾宫(动规:最大子矩形问题/悬线法)
题目链接:传送门 题目大意: 求由F构成的最大子矩阵的面积.输出面积的三倍. 1 ≤ N,M ≤ 1000. 思路: 悬线法模板题. #include <bits/stdc++.h> us ...
- 集合框架 ArrayList LinkedList(待续)
ArrayList中存储的元素的内存空间是连续的, LinkedList内存空间不是连续的 集合对象不能被序列化到硬盘中 http://blog.csdn.net/eson_15/article/de ...
- java-内部类访问特点-私有成员内部类-静态成员内部类-局部内部类访问局部变量
1.内部类访问特点: - 内部类可以直接访问外部类的成员,包括私有. - 外部类要访问内部类的成员,必须创建对象. - 外部类名.内部类名 对象名 = 外部类对象.内部类对象: - 例: class ...
- Spring源码学习(总)
前文: ------------------------------------------------------------------------------------------------ ...
- [原]android 链接错误
由于没有使用NDK的makefile, 而是把NDK的toolchain集成到现有的build system, 所以出现了诡异的错误: unsupported dynamic reloc R_ARM_ ...
- js 三目运算
语法: 一个条件,二选一: 条件?当条件满足时返回的值:当条件不满足时返回的值 多个条件,多选一: 条件1?条件1满足时的值: 条件2?条件2满足时的值: 条件n ?条件n 满足时的值: 默认值: 以 ...
- LG4091 【[HEOI2016/TJOI2016]求和】
前置:第二类斯特林数 表示把\(n\)个小球放入\(m\)个不可区分的盒子的方案数 使用容斥原理分析,假设盒子可区分枚举至少有几个盒子为空,得到通项: \[S(n,m)=\frac{1}{m!}\su ...
- C++中的智能指针、轻量级指针、强弱指针学习笔记
一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...
- HIDL学习笔记
一.HIDL简单介绍 HIDL是Android8.0新出的一个技能,以service和client的方式实现hal接口,目的是想使Android系统和BSP解绑,使系统升级更加方便.HIDL的使用方法 ...
- DevExpress 中 设置 labelControl 的背景透明到图片的方法
labelControl 中的 backColor 可以设置为: TransParent 当设置为: Transparent 的时候,labelControl 的背景依然为 主form的背景颜色 ,研 ...