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民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...
随机推荐
- SEO:网站优化内容
一.内部优化 (1)meta标签优化:例如:TDK等的优化: 首页:网站名称 或者 网站名称_提供服务介绍or产品介绍 . 频道页:频道名称_网站名称. 文章 ...
- django 基于form表单上传文件和基于ajax上传文件
一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...
- C++学习(七)(C语言部分)之 输入
输入学习时的笔记(其实也没什么用,留着给自己看的) 输出是指 把内容打印到控制台窗口 输入是指 把内容输入到程序里 scanfscanf 从键盘获取内容到程序里格式占位符+变量要加取地址符 1.格式占 ...
- java依赖注入(injection)
和SpringSource分别通过其开源项目Guice及Spring Framework提供了依赖注入的功能.然而直到现在开发者也没有一种标准的.独立于供应商的方式从而无需修改其源文件就能在这些框架之 ...
- linux系统lnmp环境包搬家教程
打包搬家apt-get install zip unzip -yyum install zip unzip -y# debian ubuntu 用apt-get,centos用yumcd /home/ ...
- MySQL--线程池(Thread Pool)
================================================================= 线程池技术 在MySQL社区版中,MySQL使用one-thread ...
- Cassandra--设置数据保留时间
在Cassandra中,可以设置列的保留时间(Time To Live),当该列超过保留时间后,会下一次读取中被墓碑(Tombstone)标记,然后保留一个垃圾回收周期(表属性gc_grace_sec ...
- oracle之 AWR固定基线
前言:可以创建AWR基线来为数据库建立已保存的工作负载视图,以便以后用来与其他AWR快照进行比较. 1. 手工创建 AWR 固定基线(固定基线如果没有设置过期时间,会永久保存) -- 根据时间创建DB ...
- hbase java 基本例子
一下代码实用 0.99.0 以后的版本. package hadoop; import java.io.IOException; import java.util.ArrayList; import ...
- windows python监听文件触发脚本
from watchdog.events import * class FileEventHandler(FileSystemEventHandler): def __init__(self): Fi ...