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民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...
随机推荐
- js 下载文件的操作方法
https://blog.csdn.net/zhoumengshun/article/details/71405963
- HPU组队赛J:Ball King(线段树)
时间限制 1 Second 内存限制 512 Mb 题目描述 HPU601球王争霸赛即将举行,ACMER纷纷参加. 现在有n个人报名参赛,每个人都有一个实力值 ai,实力值较大者获胜. 为保证比赛公 ...
- kafka安装和部署
阅读目录 一.环境配置 二.操作过程 Kafka介绍 安装及部署 回到顶部 一.环境配置 操作系统:Cent OS 7 Kafka版本:0.9.0.0 Kafka官网下载:请点击 JDK版本:1.7. ...
- (18)jq事件操作
jq的私人网站:http://jquery.cuishifeng.cn/ 具体的查看上面的网站 <!DOCTYPE html><html><head> <me ...
- 《DSP using MATLAB》Problem 6.8
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- MySQL Disk--SSD和HDD的性能
========================================================= 机械硬盘的性能 7200转/分的STAT硬盘平均物理寻道时间是9ms 10000转/ ...
- oracle-scn
在2012年第一季度的CPU补丁中,包含了一个关于SCN修正的重要变更,这个补丁提示,在异常情况下,Oracle的SCN可能出现异常增长,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重 ...
- Hi3516CV300 sample -> region
- storage 事件监听
在公司的一次内部分享会上, 偶然知道了这个H5的新事件, 解决了我之前的一个bug. 事情是这样的, 第A网页上显示的数量的总和, 点击去是B页面, 可以进行管理, 增加或者删除, 当用户做了增删操作 ...
- windows python监听文件触发脚本
from watchdog.events import * class FileEventHandler(FileSystemEventHandler): def __init__(self): Fi ...