bzoj 3674: 可持久化并查集加强版
时间:2019-09-03
本文章向大家介绍bzoj 3674: 可持久化并查集加强版,主要包括bzoj 3674: 可持久化并查集加强版使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Description
Description:
自从zkysb出了可持久化并查集后……
hzwer:乱写能AC,暴力踩标程
KuribohG:我不路径压缩就过了!
ndsf:暴力就可以轻松虐!
zky:……
n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
请注意本题采用强制在线,所给的a,b,k均经过加密,加密方法为x = x xor lastans,lastans的初始值为0
0<n,m<=2*10^5
Input
Output
Sample Input
5 6
1 1 2
3 1 2
2 1
3 0 3
2 1
3 1 2
1 1 2
3 1 2
2 1
3 0 3
2 1
3 1 2
Sample Output
1
0
1
0
1
类似3673。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 using namespace std; 6 int son[4000010][2],par[4000010],cnt; 7 void build(int &x,int l,int r) 8 { 9 x=++cnt; 10 if(l==r) 11 { 12 par[x]=l; 13 return; 14 } 15 int mid=(l+r)>>1; 16 build(son[x][0],l,mid); 17 build(son[x][1],mid+1,r); 18 } 19 void update(int &x,int l,int r,int p,int v) 20 { 21 cnt++; 22 son[cnt][0]=son[x][0]; 23 son[cnt][1]=son[x][1]; 24 x=cnt; 25 if(l==r) 26 { 27 par[x]=v; 28 return; 29 } 30 int mid=(l+r)>>1; 31 if(p<=mid)update(son[x][0],l,mid,p,v); 32 else update(son[x][1],mid+1,r,p,v); 33 } 34 int getpar(int x,int l,int r,int p) 35 { 36 if(l==r)return par[x]; 37 int mid=(l+r)>>1; 38 if(p<=mid)return getpar(son[x][0],l,mid,p); 39 else return getpar(son[x][1],mid+1,r,p); 40 } 41 int root[200010]; 42 int n,m; 43 pair<int,int> getrot(int k,int x) 44 { 45 int y; 46 int rnk=0; 47 while((y=getpar(root[k],1,n,x))!=x)rnk++,x=y; 48 return make_pair(x,rnk); 49 } 50 int ans; 51 int main() 52 { 53 scanf("%d%d",&n,&m); 54 build(root[0],1,n); 55 for(int i=1;i<=m;i++) 56 { 57 int op; 58 scanf("%d",&op); 59 if(op==2) 60 { 61 int k; 62 scanf("%d",&k); 63 k^=ans; 64 root[i]=root[k]; 65 } 66 else 67 { 68 root[i]=root[i-1]; 69 int a,b; 70 scanf("%d%d",&a,&b); 71 a^=ans;b^=ans; 72 pair<int,int>ta=getrot(i-1,a),tb=getrot(i-1,b); 73 a=ta.first;b=tb.first; 74 if(op==1) 75 { 76 int ra=ta.second,rb=tb.second; 77 if(a!=b) 78 { 79 if(ra<rb)update(root[i],1,n,a,b); 80 else update(root[i],1,n,b,a); 81 } 82 } 83 else 84 { 85 if(a==b)ans=1;else ans=0; 86 printf("%d\n",ans); 87 } 88 } 89 } 90 return 0; 91 }
原文地址:https://www.cnblogs.com/ZJXXCN/p/11455242.html
- [认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分)
- [认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)
- [OIDC in Action] 1. 基于OIDC(OpenID Connect)的SSO
- [OIDC in Action] 2. 基于OIDC(OpenID Connect)的SSO(纯JS客户端)
- [认证授权] 2.OAuth2授权(续) & JWT(JSON Web Token)
- [Cake] 0.C#Make自动化构建-简介
- [认证授权] 3.基于OAuth2的认证(译)
- [Asp.Net Core] 1. IIS中的 Asp.Net Core 和 dotnet watch
- kafka数据迁移实践
- HDFS 2.x 磁盘间数据均衡的一种可行办法
- Batik渲染png图片异常的bug修复全程记录
- Web应用服务器安全:攻击、防护与检测
- 基于Go Packet实现网络数据包的捕获与分析
- 动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现左上角(其他边角)倾斜的标签(环绕效果)效果
- Android开发中Button组件的使用
- Android开发之基于RecycleView实现的头部悬浮控件
- Android如何通过命令行操作Sqlite3数据库的方法
- Android实现沉浸式状态栏功能
- PHP对验证码的认证过程
- Android实现图片加载进度提示
- android shape实现阴影或模糊边效果
- Spring Data JPA主键采用UUID策略
- Android自定义控件之水平圆点加载进度条
- Android屏幕旋转之横屏竖屏切换的实现
- Android Studio连接SQLite数据库的登录注册实现
- Android 获取 usb 权限的两种方法
- Android实现两圆点之间来回移动加载进度
- Android使用第三方库实现日期选择器