bzoj 3673 可持久化并查集 by zky
Description
n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
0<n,m<=2*10^4
Input
Output
Sample Input
1 1 2
3 1 2
2 0
3 1 2
2 1
3 1 2
Sample Output
0
1
思路:
#include<bits/stdc++.h>
using namespace std;
#define mid int m = (l + r) >> 1
const int M = 2e6 + ; int sum[M],ls[M],rs[M],dep[M],n,idx,root[M];
void build(int l,int r,int &rt){
rt = ++idx;
if(l == r){
sum[rt] = l;
return ;
}
mid;
build(l,m,ls[rt]); build(m+,r,rs[rt]);
return ;
} void update(int old,int &rt,int p,int c,int l,int r){
rt = ++idx; ls[rt] = ls[old]; rs[rt] = rs[old];
dep[rt] = dep[old];
if(l == r){
sum[rt] = c;
return ;
}
mid;
if(p <= m) update(ls[old],ls[rt],p,c,l,m);
else update(rs[old],rs[rt],p,c,m+,r);
} int query(int p,int l,int r,int rt){
if(l == r) return rt;
mid;
if(p <= m) return query(p,l,m,ls[rt]);
else return query(p,m+,r,rs[rt]);
} void add(int p,int l,int r,int rt){
if(l == r){
dep[rt] ++;
return;
}
mid;
if(p <= m) add(p,l,m,ls[rt]);
else add(p,m+,r,rs[rt]);
} int fd(int x,int rt){
int pos = query(x,,n,rt);
if(x == sum[pos]) return pos;
return fd(sum[pos],rt);
} int main()
{
int q,op,x,y,k;
scanf("%d%d",&n,&q);
build(,n,root[]);
for(int i = ;i <= q;i ++){
scanf("%d",&op);
if(op == ){
scanf("%d%d",&x,&y);
root[i] = root[i-];
int fx = fd(x,root[i-]);
int fy = fd(y,root[i-]);
if(sum[fx] == sum[fy]) continue;
if(dep[fx] > dep[fy]) swap(fx,fy);
update(root[i-],root[i],sum[fx],sum[fy],,n);
if(dep[fx] == dep[fy]) add(sum[fy],,n,root[i]);
}
else if(op == ){
scanf("%d",&k);
root[i] = root[k];
}
else {
root[i] = root[i-];
scanf("%d%d",&x,&y);
int fx = fd(x,root[i]);
int fy = fd(y,root[i]);
if(sum[fx] == sum[fy]) printf("1\n");
else printf("0\n");
}
}
return ;
}
bzoj 3673 可持久化并查集 by zky的更多相关文章
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- 3673: 可持久化并查集 by zky
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 2170 Solved: 978[Submit][Status ...
- 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=3673 题意: 思路: 可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作 ...
- bzoj 3673 可持久化并查集
本质上是维护两个可持久化数组,用可持久化线段树维护. /************************************************************** Problem: ...
- BZOJ 3674 可持久化并查集加强版(主席树变形)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [Submit][Sta ...
- 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树
没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
随机推荐
- Python入门-从HelloWorld开始
前言 最近在招聘网上看了许多公司的招聘要求,发现很多公司希望求职者能会Python,特别是一些自动化测试的职位,以前对Python只是介于听说或是一些简单的了解,所以既然市场有需求,那么我们就来学习一 ...
- Python_每日习题_0006_斐波那契数列
程序设计: 斐波那契数列(Fibonacci sequence),从1,1开始,后面的每一项等于前面两项之和. 图方便就递归实现,图性能就用循环. # for 循环 target = int(inpu ...
- ES6 Promise 详解
一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: ...
- 简单QR分解之Gram-Schmit正交化&&Householder变换&&Givens Rotation变换&&计算步骤
- pandas数据的分组与分列
读入数据: 数据分组:我们可以看到num这列它的数字在0-20之间变化,我们可以对其增加一列,用来对其分组 df['新增一列的名称']=pd.cut(df['要分组的列'],要分组的区间,新增一列后 ...
- B-Tree 和 B+Tree
B-Tree和B+Tree 本文来自 Hubery_James 的CSDN 博客 ,全文地址请点击:原文地址-干货满满 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索 ...
- openstack-KVM管理工具
一. virsh 通过libvirt API管理Hpervisor.node.domain,实现多数功能调用. 即统一管理多台计算机上的域. 1.管理其他服务器(node) (1)修改配置文件:vim ...
- tomcat redis 集群 session共享
jcoleman/tomcat-redis-session-manager: Redis-backed non-sticky session store for Apache Tomcathttps: ...
- 【Java基础】switch语句实现根据数字输出对应星期
代码: import java.util.Scanner; /* * switch语句格式: * switch(表达式) { * case 值1: * 语句体1; * break; * case 值2 ...
- npm的nrm命令使用--设置镜像地址
npm下载会很慢,因为npm默认从国外下载资源,建议修改npm镜像源地址 1.运行npm i nrm -g全局安装nrm包: 2.使用nrm ls查看当前所有可用的镜像源地址以及当前所使用的镜像源地址 ...