来自FallDream的博客,未经允许,请勿转载,谢谢。


cut掉部分题面。

给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex
mex就是一个集合中最小的没有出现的非负整数,注意0要算
比如说集合是1,9,2,6,0,8,1,7,则出现了0,1,2,6,7,8,9这7种不同的点权,因为没有3所以mex是3
n<=100000,总共询问的链数量<=100000 权值<=30000
 
考虑对树分块,预处理每个块的中心到它父亲中同样是中心的点的bitset,然后查询的时候先暴力跳到中心,再能跳到上一个中心就跳,最后再暴力跳即可。
手写bitset来查询答案。
预处理复杂度$n\sqrt{n}$,每次询问复杂度是$O(\sqrt{n}+\frac{30000}{64})$
 
另一道由乃打扑克也是同样的做法,最后询问的时候,16位可以一起处理,预处理0-65535里面每个数低位连续的1的数量,中间的1在不同幂次下的贡献和高位连续的1的数量。
雪辉
#include<iostream>
#include<cstdio>
#define MN 100000
#define MB 320
#define MD 17
#define ull unsigned long long
#define getchar() (*S++)
char B[<<],*S=B;
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
int n,m,flag,w[MN+],head[MN+],cnt=,fa[MD+][MN+],mx[MN+];
int mark[MN+],dep[MN+],rt[MB+],rtnum=,top[MN+],Num[MN+];
struct edge{int to,next;}e[MN*+];
ull MAXN=;
struct Bitset
{
ull s[];int len;
void Clear(){for(int i=;i<;++i) s[i]=;len=;}
void operator |=(int x){s[x>>]|=1LL<<(x&);len=max(len,x>>);}
void operator |=(const Bitset&y)
{
len=max(len,y.len);
for(int i=;i<=len;++i)
s[i]|=y.s[i];
}
int num()
{
int res=;
for(int i=;i<=len;++i)
res+=Num[s[i]>>]+Num[(s[i]>>)&]+Num[(s[i]>>)&]+Num[s[i]&];
return res;
}
int Query()
{
for(int i=;i<;++i) if(s[i]!=MAXN)
for(int j=;j<;++j)
if(!(s[i]&((ull)<<j)))
return i*+j;
}
}b[MB+][MB+],ans; inline void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
e[++cnt]=(edge){f,head[t]};head[t]=cnt;
} void init(int x)
{
mx[x]=dep[x];
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa[][x])
{
fa[][e[i].to]=x;
dep[e[i].to]=dep[x]+;
init(e[i].to);
mx[x]=max(mx[x],mx[e[i].to]);
}
if(mx[x]-dep[x]>=MB||x==) mx[x]=,rt[mark[x]=++rtnum]=x;
} inline int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int k=dep[x]-dep[y],j=;k;k>>=,++j)
if(k&) x=fa[j][x];
if(x==y) return x;
for(int i=MD;~i;--i)
if(fa[i][x]!=fa[i][y])
x=fa[i][x],y=fa[i][y];
return fa[][x];
}
int last=;
int main()
{
fread(B,,<<,stdin);
n=read();m=read();flag=read();
for(int i=;i<;++i) MAXN|=(ull)<<i;
for(int i=;i<=;++i)
for(int j=i;j;j>>=)
Num[i]+=(j&);
for(int i=;i<=n;++i) w[i]=read();
for(int i=;i<n;++i) ins(read(),read());
dep[]=;init();
for(int i=;i<=MD;++i)
for(int j=;j<=n;++j)
fa[i][j]=fa[i-][fa[i-][j]];
for(int i=;i<=rtnum;++i)
{
Bitset now;now.Clear();now|=w[rt[i]];b[i][i]=now;
for(int k=fa[][rt[i]];k;k=fa[][k])
{
now|=w[k];
if(mark[k])
{
b[i][mark[k]]=now;
if(!top[rt[i]]) top[rt[i]]=k;
}
}
}
for(int i=;i<=m;++i)
{
ans.Clear();int nn=read();
for(int j=;j<=nn;++j)
{
int x=read(),y=read(),xx,yy;
if(flag) x^=last,y^=last;
int z=lca(x,y);ans|=w[x];ans|=w[y];
for(;!mark[x]&&dep[x]>dep[z];)
x=fa[][x],ans|=w[x];
for(;!mark[y]&&dep[y]>dep[z];)
y=fa[][y],ans|=w[y];
for(xx=x;dep[top[xx]]>=dep[z];xx=top[xx]);
for(yy=y;dep[top[yy]]>=dep[z];yy=top[yy]);
ans|=b[mark[x]][mark[xx]];
ans|=b[mark[y]][mark[yy]];
for(;xx!=yy;)
{
if(dep[xx]<dep[yy]) swap(xx,yy);
xx=fa[][xx];ans|=w[xx];
}
}
int x=ans.num(),y=ans.Query();
last=x+y;
printf("%d %d\n",x,y);
}
return ;
}

由乃打扑克

#include<iostream>
#include<cstdio>
#define MN 100000
#define MB 350
#define MD 17
#define int unsigned int
#define uint int
#define ull unsigned long long
#define getchar() (*S++)
char B[<<],*S=B;
using namespace std;
inline long long read()
{
long long x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
int n,m,w[MN+],head[MN+],cnt=,fa[MD+][MN+],mx[MN+];
int mark[MN+],dep[MN+],rt[MB+],rtnum=,top[MN+],front[MN+],back[MN+];
uint pw[][],Num[][],K,last=;
struct edge{int to,next;}e[MN*+]; void Combine(uint&ans,uint&len,int x)
{
if(x==) {len+=;return;}
len+=front[x];ans+=pw[len][K];
ans+=Num[x][K];len=back[x];
}
struct Bitset
{
ull s[];int len;
void Clear(){for(int i=;i<;++i) s[i]=;len=;}
void operator |=(int x){s[x>>]|=1LL<<(x&);len=max(len,x>>);}
void operator |=(const Bitset&y)
{
len=max(len,y.len);
for(int i=;i<=len;++i)
s[i]|=y.s[i];
}
uint Query(int k)
{
uint ans=,L=;
for(int i=;i<=len;++i)
Combine(ans,L,s[i]&),
Combine(ans,L,(s[i]>>)&),
Combine(ans,L,(s[i]>>)&),
Combine(ans,L,(s[i]>>)&);
return (ans+=pw[L][k]);
}
}b[MB+][MB+],ans; inline void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
e[++cnt]=(edge){f,head[t]};head[t]=cnt;
} void init(int x)
{
mx[x]=dep[x];
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa[][x])
{
fa[][e[i].to]=x;
dep[e[i].to]=dep[x]+;
init(e[i].to);
mx[x]=max(mx[x],mx[e[i].to]);
}
if(mx[x]-dep[x]>=MB||x==) mx[x]=,rt[mark[x]=++rtnum]=x;
} inline int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int k=dep[x]-dep[y],j=;k;k>>=,++j)
if(k&) x=fa[j][x];
if(x==y) return x;
for(int i=MD;~i;--i)
if(fa[i][x]!=fa[i][y])
x=fa[i][x],y=fa[i][y];
return fa[][x];
} main()
{
fread(B,,<<,stdin);
n=read();m=read();
for(int i=;i<=;++i)
{
int k=;pw[i][]=;
for(int j=;j<=;++j)
pw[i][j]=(k*=i);
} for(int i=;i<=;++i)
{
int j=,flag=;
for(int k=i,kk=;kk<=;++kk,k>>=)
if(k&) ++j;
else
{
if(!flag) flag=,front[i]=j;
else for(int kkk=;kkk<=;++kkk)
Num[i][kkk]+=pw[j][kkk];
j=;
}
back[i]=j;
}
for(int i=;i<=n;++i) w[i]=read();
for(int i=;i<n;++i) ins(read(),read());
dep[]=;init();
for(int i=;i<=MD;++i)
for(int j=;j<=n;++j)
fa[i][j]=fa[i-][fa[i-][j]];
for(int i=;i<=rtnum;++i)
{
Bitset now;now.Clear();now|=w[rt[i]];b[i][i]=now;
for(int k=fa[][rt[i]];k;k=fa[][k])
{
now|=w[k];
if(mark[k])
{
b[i][mark[k]]=now;
if(!top[rt[i]]) top[rt[i]]=k;
}
}
}
for(int i=;i<=m;++i)
{
ans.Clear();int nn=read();
for(int j=;j<=nn;++j)
{
uint x=(read()^last),y=(read()^last),xx,yy;
uint z=lca(x,y);ans|=w[x];ans|=w[y];
if(x<||x>n||y<||y>n) return ;
for(;!mark[x]&&dep[x]>dep[z];)
x=fa[][x],ans|=w[x];
for(;!mark[y]&&dep[y]>dep[z];)
y=fa[][y],ans|=w[y];
for(xx=x;dep[top[xx]]>=dep[z];xx=top[xx]);
for(yy=y;dep[top[yy]]>=dep[z];yy=top[yy]);
ans|=b[mark[x]][mark[xx]];
ans|=b[mark[y]][mark[yy]];
for(;xx!=yy;)
{
if(dep[xx]<dep[yy]) swap(xx,yy);
xx=fa[][xx];ans|=w[xx];
}
}
printf("%u\n",last=ans.Query(K=read()));
}
return ;
}

[bzoj4763]雪辉&[bzoj4812][Ynoi2017]由乃打扑克的更多相关文章

  1. 洛谷P3603 || bzoj 4763 雪辉 && bzoj4812: [Ynoi2017]由乃打扑克

    https://www.luogu.org/problemnew/show/P3603 https://www.lydsy.com/JudgeOnline/problem.php?id=4763 就是 ...

  2. Bzoj4763 雪辉

    Time Limit: 39 Sec  Memory Limit: 666 MBSubmit: 151  Solved: 80 Description 上次立下的NOIP退役Flag没有成功   这次 ...

  3. bzoj4812: [Ynoi2017]由乃打扑克

    由于查询的是树链的并的信息,同时信息不能高效合并,只能考虑用bitset维护,小范围暴力预处理以便从bitset算出答案 对树分块,保证每块是连通的且直径较小,对分出的块缩点建新树,在新树上建树上ST ...

  4. 「BZOJ4763」雪辉

    「BZOJ4763」天野雪辉 题目大意:有一棵 \(n\) 个点的树,树上每一个点有权值 \(a_i \leq 30000\) ,每次询问给出若干路径,求出这些路径的并上面的不同颜色数与 \(mex\ ...

  5. [BZOJ 4763]雪辉

    [BZOJ 4763] 雪辉 题意 给定一棵 \(n\) 个点的无根树, 点带权. \(q\) 次询问, 每次给定树上的若干路径, 求这些路径上的点共有多少种不同权值以及这些点的权值组成的集合的 \( ...

  6. [题解] 洛谷 P3603 雪辉

    模拟赛中遇到了这个题,当时我这个沙雕因为把一个\(y\)打成了\(x\)而爆零.回来重新写这道题,莫名其妙的拿了rank1... 我的解法与其他几位的题解有些不同我太蒻了.并没有选取所谓的关键点,而是 ...

  7. MVC |分部视图 PartialView()

    介绍如何定义 其实它和普通视图没有多大区别,只是创建分部视图的时候视图里没有任何内容,你需要什么标签你自己加.第二就是分部视图不会执行_ViewStart.cshtml中的内容) 控制器 Partia ...

  8. 【刷题】洛谷 P3613 睡觉困难综合征

    题目背景 刚立完Flag我就挂了WC和THUWC... 时间限制0.5s,空间限制128MB 因为Claris大佬帮助一周目由乃通过了Deus的题,所以一周目的由乃前往二周目世界找雪辉去了 由于二周目 ...

  9. [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)

    4722: 由乃 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 360  Solved: 131[Submit][Status][Discuss] D ...

随机推荐

  1. C#中委托。

    委托(delegate):是一个类型.其实winform中控件的事件也是特殊的委托类型. 如: 自定义委托:自定义委托在winform中的用法. 当要在子线程中更新UI时,必须通过委托来实现. pri ...

  2. Python机器学习—导入各种数据的N种办法

    pandas 读取数据 一.导入一般的文件 1.read_csv(),用来读取CSV文件 官方文档是这么说的:Read CSV (comma-separated) file into DataFram ...

  3. @SpringBootApplication 组合注解包含哪些注解及作用

    序:在学习springboot,教程一般对一些注解语焉不详,发现@SpringBootApplication 这个注解包含了很多注解,也就是说使用这个注解可以少写几个注解,这里看源码粘出来一些,仅用于 ...

  4. kali linux 2.0 web 渗透测试 电子书

    原创 2017-05-31 玄魂工作室 玄魂工作室 打起精神,重新开启订阅号的原创文章写作工作,但是需要点时间,请耐心等待. 求资料的同学,没有及时回复的,请再次留言,我会尽快处理.今天分享两本电子书 ...

  5. Web Api 接收图片

    public async Task<HttpResponseMessage> Upload() { if (!Request.Content.IsMimeMultipartContent( ...

  6. Docker学习笔记 - Docker Compose

    一.概念 Docker Compose 用于定义运行使用多个容器的应用,可以一条命令启动应用(多个容器). 使用Docker Compose 的步骤: 定义容器 Dockerfile 定义应用的各个服 ...

  7. eclipse+Maven插件报错:-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.

    问题描述: eclipse indigo+maven3.3.3+jdk1.70 maven插件执行报错:-Dmaven.multiModuleProjectDirectory system prope ...

  8. OAuth2.0学习(1-8) 授权方式五之Access_Token令牌过期更新

    OAuth2.0的Access_Token令牌过期更新 如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌. 客户端发 ...

  9. Asp.NET Core2.0 项目实战入门视频课程_完整版

    END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...

  10. Linux网络配置(setup)

    新装的Linux系统,想要快捷的网络配置,首选setup命令. 1.设置setup为中文. echo LANG="zh_CN.UTF-8" > /etc/sysconfig/ ...