来自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. 小草手把手教你LabVIEW串口仪器控制—安装使用仪器现有驱动

    声明:很多仪器是没有驱动的.所以,具体问题具体分析.另外声明:所谓的驱动,也就是封装好的底层的串口通信程序,也是程序而已,只不过别人帮你做成了子 VI,让自己容易用.所以:不要弄混淆了概念.国外的很多 ...

  2. ajax的四种type类型

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  3. Winserver+Apache+django部署

    废话不多说,干活直接上. winserver2012 + django2.0.1 + apache 部署过程 python ==> 3.4 64位 https://www.python.org/ ...

  4. nyoj 还是回文

    还是回文 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一个字符, ...

  5. 微信浏览器的页面在PC端访问

    微信浏览器的页面在PC端访问: 普通的在微信浏览器看的页面如果不在php代码中解析一下,然后复制链接在PC打开就出现无法访问,因为它复制的地址是: https://open.weixin.qq.com ...

  6. New UWP Community Toolkit - DropShadowPanel

    概述 UWP Community Toolkit  中有一个为 Frmework Element 提供投影效果的控件 - DropShadowPanel,本篇我们结合代码详细讲解  DropShado ...

  7. 求解数独难题, Sudoku问题(回溯)

    Introduction : 标准的数独游戏是在一个 9 X 9 的棋盘上填写 1 – 9 这 9 个数字,规则是这样的: 棋盘分成上图所示的 9 个区域(不同颜色做背景标出,每个区域是 3 X 3 ...

  8. hibernate_exercise-many- to-one(1)

    多对一关系 1.创建t_user表.t_group表 2.在eclipse中创建对应的实体类 package com.eneity; public class User { private int i ...

  9. ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除

    bulk 批量操作-实现多个文档的创建.索引.更新和删除 ----------------------------------------------------------------------- ...

  10. 新概念英语(1-37)Making a bookcase

    What is Susan's favourite color ? A:You're working hard, Georage. What are you doing? B:I am making ...