Description

给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex
mex就是一个集合中最小的没有出现的非负整数,注意0要算
比如说集合是1,9,2,6,0,8,1,7,则出现了0,1,2,6,7,8,9这7种不同的点权,因为没有3所以mex是3

Solution

暴力做法是枚举把点对 \((x,y)\) 往上跳,用桶记录一下答案
我们想办法把往上跳的过程分块优化,于是随机 \(\sqrt{n}\) 个点作为关键点
预处理出每一个关键点往上跳到的第一个关键点和到往上的每一个关键点的桶
这样询问就可以先暴力找到第一个关键点,然后从关键点开始每次跳到下一个关键点,再从最后一个跳到 \(lca\),跳的次数期望是 \(\sqrt{n}\) 的
这个桶用 \(bitset\) 代替,就可以 \(O(\frac{30000}{32})\) 的合并的了
由于要找 \(mex\) 所以要手写
关于区间 \(mex\) 判断每一个数字是否是满的,如果不满,则暴力扫这个数字的每一位
\(count\) 函数也可以预处理出每一个数字的 \(1\) 的个数
这样 \(mex,count\) 的复杂度都是 \(O(\frac{30000}{32})\) 了

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){int f;char c;for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=1e5+10,B=320;
int n,Q,m,T,a[N],head[N],nxt[N*2],to[N*2],num=0,p[N],dep[N];
bool imp[N];int fa[N][18],t[N],id[N],top[N],mx=0;
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
bitset<30001>f[B+1][B+1],g,ans;//B*B*30000*4/1024/1024
inline void dfs(int x){for(int i=1;i<=17;i++)fa[x][i]=fa[fa[x][i-1]][i-1];for(int i=head[x],u;i;i=nxt[i]){if(dep[u=to[i]])continue;dep[u]=dep[x]+1;fa[u][0]=x;dfs(u);}
}
inline int lca(int x,int y){if(dep[x]<dep[y])swap(x,y);for(int i=17;i>=0;i--)if((dep[x]-dep[y])>>i&1)x=fa[x][i];if(x==y)return x;for(int i=17;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];return fa[x][0];
}
inline void solve(int u){int x=p[u];g.reset();while(x){g.set(a[x]);if(imp[x]){f[u][id[x]]=g;if(x!=p[u] && !top[p[u]])top[p[u]]=x;}x=fa[x][0];}
}
inline int getmex(){for(int i=0;i<=mx;i++)if(!ans[i])return i;return mx+1;
}
int main(){freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);//cout<<(sizeof(f)+sizeof(pre))/1000/1000<<endl;srand(19260817);int x,y,k,z,lastans=0;cin>>n>>Q>>T;for(int i=1;i<=n;i++)gi(a[i]),mx=max(mx,a[i]);for(int i=1;i<n;i++){gi(x);gi(y);link(x,y);link(y,x);}for(int i=1;i<=n;i++)p[i]=i;random_shuffle(p+1,p+n+1);for(int i=(m=min(B,n));i>=1;i--)imp[p[i]]=1,id[p[i]]=i;dep[1]=1;dfs(1);for(int i=1;i<=m;i++)solve(i);while(Q--){gi(k);ans.reset();while(k--){gi(x);gi(y);x^=(lastans*T);y^=(lastans*T);z=lca(x,y);ans.set(a[z]);while(x!=z && !imp[x])ans.set(a[x]),x=fa[x][0];int last=id[x];while(imp[x] && dep[top[x]]>=dep[z])x=top[x];ans|=f[last][id[x]];while(x!=z)ans.set(a[x]),x=fa[x][0];while(y!=z && !imp[y])ans.set(a[y]),y=fa[y][0];last=id[y];while(imp[y] && dep[top[y]]>=dep[z])y=top[y];ans|=f[last][id[y]];while(y!=z)ans.set(a[y]),y=fa[y][0];}int t1=ans.count(),t2=getmex();lastans=t1+t2;printf("%d %d\n",t1,t2);}return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/9092175.html

bzoj 4763: 雪辉相关推荐

  1. [BZOJ 4763]雪辉

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

  2. 4763: 雪辉[点分治+可持久化分块]

    4763: 雪辉 Time Limit: 39 Sec  Memory Limit: 666 MB Submit: 85  Solved: 51 [Submit][Status][Discuss] D ...

  3. [洛谷]CON1466 洛谷2017春节联欢赛 Hello Dingyou题解 Bzoj4763雪辉

    题目来源:https://www.luogu.org/contest/show?tid=1466 创建时间:2017/3/13 18:33 镇楼图:       猜猜她是谁~ 解题思路: 春节居然也有 ...

  4. Bzoj4763 雪辉

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

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

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

  6. 「BZOJ4763」雪辉

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

  7. [题解] 洛谷 P3603 雪辉

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

  8. [BZOJ4763][P3603]雪辉[手写bitset+静态分块]

    题意:给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex mex就是一个集合中最小的没有出现的非负整数,注意0要算 rand出 \(\sqrt n\)个点,把每 ...

  9. bzoj 乱刷计划 50/50

    前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...

最新文章

  1. 计算机的最原始知识,新版计算机基础知识
  2. 使用Xcode修改iOS项目工程名和路径名
  3. 声明对象_计算机各语言数据类型及对象声明之区别
  4. 201771010119穷吉第八周
  5. IDC、刘润:企业如何通过数字化转型,驱动业务发展?附98页PPT
  6. 程序员界年度人口普查:6成以上开发者日工作超9小时,且从不运动
  7. 炫酷超漂亮辅助网站源码
  8. 后台解析数据--form表单get、post方法的使用(如何上传图片到服务器)
  9. .net中对时间的操作
  10. Web基础(Java前端基础)
  11. Element Dialog弹框回到顶部
  12. c# rar解压大小_C# 利用WinRAR (加密)压缩及解压缩
  13. 双目立体匹配算法:ELAS
  14. Java串口通信(RXTX)
  15. HoRNet SongKey MKIII Mac - 实时调性和弦检测
  16. SFP光模块高低温老化测试 高低温试验测试设备
  17. Linux文件打包与压缩
  18. 人工智能主要应用的七大领域
  19. 第108章 属性关键字 - Required
  20. 3DTouch Demo

热门文章

  1. KSO-sql server获取当月天数
  2. Oracle和Mysql的区别
  3. Docker的volumes的使用
  4. 为什么在Visual Studio Code 中输入的汉字变成繁体字了?电脑上其他地方的输入是正常的
  5. 跨境网上收款 找PayPal没错(php如何实现paypal支付)
  6. pci总线定时协议_PCI总线标准及协议
  7. 2022/4/18 天梯赛刷题记录2022天梯赛热身赛
  8. 苹果系统怎么连宽带连接服务器未响应,苹果电脑怎么连宽带 MAC系统怎么连接有线宽带...
  9. java单选框的讲课ppt6_Joho Lewis《Java Software Solutions》第六版课件第十....ppt
  10. 解决运行js代码报错—Warning: To load an ES module, set “type“: “module“ in the package.json or use the .mjs