Time Limit: 39 Sec  Memory Limit: 666 MB
Submit: 151  Solved: 80

Description

上次立下的NOIP退役Flag没有成功
 
这次就立一个WC狗牌的Flag
 
三周目的由乃被钦定成为了卡密,她立刻赶去二周目的世界寻找雪辉
 
但是按照设定,两个平行世界是没法互相影响的,也就是原则上由乃是没法去二周目世界的
 
这时候Deus又跳出来说,其实设定是作者骗你的,只要爱的力量足够强大什么都可以做到(好狗血)
 
Deus:由乃你为了雪辉是不是什么都可以做呀
 
yuno:当然啦这还用想
 
Deus:那你帮我做个题吧
 
yuno:只要不是数据结构,什么题我都做
 
Deus:出题人是那个nzhtl1477呀,他出(抄)的题除了傻逼数据结构还有啥。。。
 
yuno:你说的很有道理。。。
 
Deus:上次那个题你不是两分钟就秒了吗,这个题比那个还简单
 
yuno:(小声)其实那个是bzoj上面的大佬帮我做的
 
Deus:好吧就这么愉快的钦定了
 
给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex
 
mex就是一个集合中最小的没有出现的非负整数,注意0要算
 
比如说集合是1,9,2,6,0,8,1,7,则出现了0,1,2,6,7,8,9这7种不同的点权,因为没有3所以mex是3

Input

第一行三个数n,m,意义如题所述,和一个数f
 
如果f是0,代表Deus没有使用膜法,如果f是1,代表Deus使用了膜法
 
之后一行n个数,表示点权
 
之后n-1行,每行两个数x,y,表示x和y节点之间有一条边,保证是一个树
 
之后m行,每行先是一个数a,表示这次输入a条链,紧接着2a个数(x1,y1)(x2,y2)...表示每条树链
 
如果数据被Deus施了膜法,这2a个数都要异或上上一个询问的答案lastans,如果是第一次询问则这个lastans = 0,因为每次询问有两个答案,lastans为这两个答案的和
 
如果没有膜法,则-1s并且不异或
 
数据范围:
 
设a的和为q
 
对于20%的数据,n,q<=1000,f=0
 
对于另外30%的数据,n,q<=100000,树是一条链,f=0
 
对于所有数据n,q<=100000,且点权<=30000

Output

m行,每行两个数表示点权种类数以及mex

Sample Input

10 1 1
0 0 1 0 0 2 2 0 0 0
2 3
1 2
4 5
3 4
7 8
6 7
5 6
9 10
8 9
4
1 7
3 3
1 1
9 3

Sample Output

3 3

HINT

可爱(口径)即正义~

Source

树 树分块 bitset

询问区间mex,理论上桶是必须要开的。这题强制在线不能树上莫队,那就只能用bitset即时维护了。

直接爬树链显然不可取,我们可以考虑树分块。

统计一条链(x,y)的答案时,拆成(x,LCA)和(y,LCA)分别处理,先向上跳到当前点所在块的中心,然后整块往上跳,再跳完零碎的部分。

因为我们要查询的是链的信息,和区域无关,所以分块应该按照深度分而不是子树大小。

stl的bitset不支持询问mex,所以要手写bitset

博主码代码的时候出现了很多细节上的问题,导致复杂度不稳定,无情被卡。

这是一个悲伤的故事,这个故事告诉我们永远不要迷之自信地认为自己的诡异写法能艹过正解。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define UL long long
using namespace std;
const int mxn=;
const UL ful=0xFFFFFFFFFFFFFFFF;
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;
}
void write(int x){
if(x>)write(x/);
putchar(''+x%);
return;
}
struct edge{
int v,nxt;
}e[mxn<<];
int hd[mxn],mct=;
void add_edge(int u,int v){
e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;return;
}
//
int num[];
struct BIT{
UL x[];
inline void clear(){memset(x,,sizeof x);return;}
void insert(int a){
int pos=a/+;
x[pos]|=1LL<<(a%);
return;
}
void operator |= (const BIT &b){
for(register int i=;i<;i++)x[i]|=b.x[i];
return;
}
int mex(){
for(int i=;i<;i++){
if(x[i]!=ful){
int res=;
UL tmp=x[i];
while(tmp&){
res++;
tmp>>=;
}
return res+(i-)*;
}
}
return *-;
}
int calc(){
int cnt=;
for(int i=;i<;i++){
if(!x[i])continue;
if(x[i]==ful)cnt+=;
else{
UL tmp=x[i];
cnt+=num[(tmp&)]+num[(tmp>>)&];
tmp>>=;
cnt+=num[(tmp&)]+num[(tmp>>)&];
}
}
return cnt;
}
}bt[][],res;
int block=;
int dep[mxn],mx[mxn],bct=;
int Cid[mxn],C[mxn],Cfa[mxn];
int fa[mxn][];
void DFS(int u,int ff){
mx[u]=;dep[u]=dep[ff]+;
for(int i=;i<=;i++)fa[u][i]=fa[fa[u][i-]][i-];
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;if(v==ff)continue;
fa[v][]=u;
DFS(v,u);
mx[u]=max(mx[u],mx[v]+);
}
if(mx[u]>=block || u==){
mx[u]=;
bct++; Cid[u]=bct; C[bct]=u; Cfa[bct]=;
}
return;
}
int LCA(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=;i>=;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][];
}
int n,Q,F;
int lastans=;
int w[mxn];
void Build(){
block=sqrt(n+0.5);
DFS(,);
for(int i=;i<=bct;i++){
int u=C[i];
res.clear();
res.insert(w[u]);u=fa[u][];
while(u){
res.insert(w[u]);
//
if(Cid[u]){
bt[i][Cid[u]]=res;
if(!Cfa[i])Cfa[i]=u;
}
//
u=fa[u][];
}
}
return;
}
void query(int x,int y){
if(dep[x]<dep[y])swap(x,y);
if(dep[x]-dep[y]<=block){
while(dep[x]>=dep[y]){
res.insert(w[x]);
x=fa[x][];
}
return;
}
while(dep[x]>=dep[y] && !Cid[x]){
res.insert(w[x]);
x=fa[x][];
}
int tmp=x;
while(dep[Cfa[Cid[tmp]]]>=dep[y]){
tmp=Cfa[Cid[tmp]];
}
if(tmp^x)res|=bt[Cid[x]][Cid[tmp]];
x=tmp;
while(dep[x]>=dep[y]){
res.insert(w[x]);
x=fa[x][];
}
return;
}
void solve(){
int a=read(),x,y;
res.clear();
while(a--){
x=read();y=read();
if(F){x^=lastans;y^=lastans;}
//
int tmp=LCA(x,y);
query(x,tmp);query(y,tmp);
//
}
int ans1=res.mex();
int ans2=res.calc();
// printf("%d %d\n",ans2,ans1);
write(ans2);putchar(' ');write(ans1);puts("");
lastans=ans1+ans2;//
return;
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out2.txt","w",stdout);
int i,j,u,v;
n=read();Q=read();F=read();
for(i=;i<=n;i++)w[i]=read();
for(i=;i<n;i++){
u=read();v=read();
add_edge(u,v);
add_edge(v,u);
}
for(i=;i<=;i++){
int tmp=i;
while(tmp){
num[i]++;
tmp-=tmp&-tmp;
}
}
Build();
while(Q--)solve();
return ;
}

Bzoj4763 雪辉的更多相关文章

  1. [bzoj4763]雪辉&[bzoj4812][Ynoi2017]由乃打扑克

    来自FallDream的博客,未经允许,请勿转载,谢谢. cut掉部分题面. 给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex mex就是一个集合中最小的没有 ...

  2. 「BZOJ4763」雪辉

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

  3. [BZOJ 4763]雪辉

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

  4. [题解] 洛谷 P3603 雪辉

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

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

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

  6. MVC |分部视图 PartialView()

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

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

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

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

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

  9. 通过getElementById来取得Form里的表单元素

    <1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>湖南易通 ...

随机推荐

  1. By.cssSelector定位元素一个不足发现

     这个如果用cssSelector定位,代码如下,此时输出的数值是0 System.out.println(driver.findElements(By.cssSelector("div[c ...

  2. windows多线程(十) 生产者与消费者问题

    一.概述 生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池 ...

  3. ACM数论之旅2---快速幂,快速求a^b((ノ`Д´)ノ做人就要坚持不懈)

    a的b次方怎么求 pow(a, b)是数学头文件math.h里面有的函数 可是它返回值是double类型,数据有精度误差 那就自己写for循环咯 LL pow(LL a, LL b){//a的b次方 ...

  4. Install .Net Core For CentOS

    Install .NET Core SDK Before you start, please remove any previous versions of .NET Core from your s ...

  5. ReentrantLock详解 以及与synchronized的区别

    ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁 ReentrantLock lock = new ReentrantLock(tr ...

  6. jdbc的封装(使用参数文件)

    借鉴原CSDN作者yanzi1225627的一篇:http://blog.csdn.net/yanzi1225627/article/details/26950615 作者东西写的很好,自己用的时候进 ...

  7. 【刷题】BZOJ 3262 陌上花开

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  8. Mybatis笔记六:Mybatis中SqlSessionFactoryBuilder/SqlSessionFactory/SqlSession/映射器实例的作用域(Scope)和生命周期

    SqlSessionFactoryBuilder 这个类可以被实例化.使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了.因此 SqlSessionFactoryBuilder ...

  9. BZOJ 2157: 旅游

    2157: 旅游 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1347  Solved: 619[Submit][Status][Discuss] ...

  10. 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告

    P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...