颓了十多天别问我再干嘛,在补学校作业

啊,开学了……我的夏天……

【题目大意】

n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0

0<n,m<=2*10^4

【思路】

数组是可以利用线段树的形式可持久化的,方法和主席树一模一样。那么我们在可持久化数组的基础上加上并查集的操作就可以了。

每次合并操作,先查询要合并两个元素的父亲所在位置。方法是如果当前位置的v不等于它所代表的数组中的下标(不是当前下标),那么就继续find。其余操作并查集没有区别。

回到k次状态只要T[0]=T[k]即可。

查询是否属于一个集合也是找出父亲,直接判断即可,同并查集。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lson l,m
#define rson m+1,r
const int MAXN=;
using namespace std;
int T[MAXN],v[MAXN],h[MAXN],L[MAXN],R[MAXN];
int cnt,m,n; int build(int l,int r)
{
int rt=++cnt;
if (l==r) v[rt]=l;
else
{
int m=(l+r)>>;
L[rt]=build(lson);
R[rt]=build(rson);
}
return rt;
} int query(int rt,int x,int l,int r)
{
if (l==r) return rt;
int m=(l+r)>>;
if (x<=m) return query(L[rt],x,lson);
else return query(R[rt],x,rson);
} int find(int rt,int x)
{
int p=query(rt,x,,n);
if (x==v[p]) return p;
else return find(rt,v[p]);
} void update(int rt,int x,int l,int r)
{
if (l==r)
{
h[rt]++;
return;
}
int m=(l+r)>>;
if (x<=m) update(L[rt],x,lson);
else update(R[rt],x,rson);
} int modify(int pre,int x,int y,int l,int r)
{
int rt=++cnt;
if (l==r)
{
v[rt]=y;
h[rt]=h[pre];//不要忘了秩
return rt;
}
L[rt]=L[pre],R[rt]=R[pre];
int m=(l+r)>>;
if (x<=m) L[rt]=modify(L[pre],x,y,lson);
else R[rt]=modify(R[pre],x,y,rson);
return rt;
} void union_set(int fa,int fb,int i)
{
if (h[fa]>h[fb]) swap(fa,fb);
T[i]=modify(T[i-],v[fa],v[fb],,n);//注意这里是v[fa]而不是fa
if (h[fa]==h[fb]) update(T[i],v[fb],,n);
} void init()
{
cnt=;
scanf("%d%d",&n,&m);
T[]=build(,n);
} void solve()
{
for (int i=;i<=m;i++)
{
int op,a,b;
scanf("%d",&op);
if (op==)
{
scanf("%d%d",&a,&b);
T[i]=T[i-];
int fa=find(T[i],a),fb=find(T[i],b);
if (v[fa]!=v[fb]) union_set(fa,fb,i);
}
if (op==)
{
scanf("%d",&a);
T[i]=T[a];
}
if (op==)
{
scanf("%d%d",&a,&b);
T[i]=T[i-];
int fa=find(T[i],a),fb=find(T[i],b);
if (v[fa]==v[fb]) puts("");else puts("");
}
}
} int main()
{
init();
solve();
return ;
}

【可持久化并查集】BZOJ3673-可持久化并查集 by zky的更多相关文章

  1. BZOJ3673 可持久化并查集 by zky 【主席树】

    BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...

  2. bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版

    bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...

  3. [bzoj3673] 可持久化并查集 by zky

    总感觉到现在才来写这题有点奇怪. 并查集如果按秩合并的话,每次合并只会修改一个点的父亲. 用可持久化线段树来实现可持久化数组就行了.. 然而我写的是按子树大小合并..结果比按秩合并慢了一点>_& ...

  4. 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树

    [BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...

  5. BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树

    既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...

  6. Redis的增删改查命令总结与持久化方式

    原文:Redis的增删改查命令总结与持久化方式 Redis是用C语言实现的,一般来说C语言实现的程序"距离"操作系统更近,执行速度相对会更快. Redis使用了单线程架构,预防了多 ...

  7. 05[掌握]高可用、集群、持久化、docker 等前置知识点

    高可用 24小时对外提供服务 高并发 同一时间段能处理的请求数 1,中心化和去中心化 1.1,中心化 意思是所有的节点都要有一个主节点 缺点:中心挂了,服务就挂了 中心处理数据的能力有限,不能把节点性 ...

  8. 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  9. Redis的两种持久化方式-快照持久化(RDB)和AOF持久化

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为“持久化”效果. redis有两 ...

  10. HBase0.99.2集群的搭建步骤(在hadoop2.6.4集群和zookeeper3.4.5集群上)

    HBase介绍(NoSql,不是关系型数据库) HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群. HBase ...

随机推荐

  1. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  2. 在Oracle中查询表的大小

    SELECT segment_name AS TABLENAME,round(BYTES/1024/1024,2)  FROM user_segments WHERE segment_name='表名 ...

  3. Mysql储存过程8:repeat循环

    语法: repeat SQL until 条件 end repeat; 就是相当于其他语言中的: do{ # }while(); mysql> create procedure p1p() -& ...

  4. 设置网卡IP,还每次都挨个地址输入吗?批处理一下【转】

    1.设置网卡ip,子网掩码和默认网关,注意修改网卡名称,跟本地连接汇总的网卡名称保持一直 netsh interface ip set address "以太网" static 1 ...

  5. ubuntu无法获得锁 /var/lib/dpkg -open 问题

    问题: 方法: sudo rm   /var/lib/dpkg/lock 然后再安装就可以了

  6. 在Ubuntu上安装Redis MySQL MongoDB memcached Nginx

    1.安装Redis sudo apt-get install redis-server 2.安装MySQL sudo apt-get install mysql-server 3.安装MongoDB ...

  7. bug-bug-bug

    #-*-coding:utf-8-*- import urllib import urllib2 import re import json import threading import reque ...

  8. 洛谷 P1957 口算练习题 题解

    题目传送门 这道题是考字符串处理,另外输入要使用c++的cin的神奇功能. #include<bits/stdc++.h> using namespace std; int n;char ...

  9. kubeadm高可用master节点部署文档

    kubeadm的标准部署里,etcd和master都是单节点的. 但上生产,至少得高可用. etcd的高可用,用kubeadm微微扩散一下就可以. 但master却官方没有提及. 于是搜索了几篇文档, ...

  10. LoadRunner函数–lr_vuser_status_message

    http://wenku.baidu.com/link?url=KbKGldKUkam4VyH5Z2doesA0ovQpuwM9nX_SnVMtWjo6rJPxj9DqB51z_m1giMbVo5Db ...