BZOJ3673 可持久化并查集 by zky


Description

n个集合 m个操作

操作:

1 a b 合并a,b所在集合

2 k 回到第k次操作之后的状态(查询算作操作)

3 a b 询问a,b是否属于同一集合,是则输出1否则输出0

0&lt;n,m&lt;=2∗104" role="presentation" style="position: relative;">0<n,m<=2∗1040<n,m<=2∗104

Sample Input

5 6

1 1 2

3 1 2

2 0

3 1 2

2 1

3 1 2

Sample Output

1

0

1


就是并查集吗,只需要可持久化一个数组就完了

然后主席树可以很方便地实现

模拟一下并查集操作模式就好了


#include<bits/stdc++.h>
using namespace std;
#define N 200010
int n,m,tot=0;
int rt[N],ls[N],rs[N],val[N],dep[N];
void build(int &t,int l,int r){
if(l>r)return;
t=++tot;
if(l==r){val[t]=l;dep[t]=1;return;}
int mid=(l+r)>>1;
build(ls[t],l,mid);
build(rs[t],mid+1,r);
}
void modify(int &t,int last,int l,int r,int pos,int vl){
t=++tot;
if(l==r){val[t]=vl;dep[t]=dep[last];return;}
ls[t]=ls[last];
rs[t]=rs[last];
int mid=(l+r)>>1;
if(pos<=mid)modify(ls[t],ls[last],l,mid,pos,vl);
else modify(rs[t],rs[last],mid+1,r,pos,vl);
}
int query(int t,int l,int r,int pos){
if(l==r)return t;
int mid=(l+r)>>1;
if(pos<=mid)return query(ls[t],l,mid,pos);
else return query(rs[t],mid+1,r,pos);
}
void add(int t,int l,int r,int pos){
if(l==r){dep[t]++;return;}
int mid=(l+r)>>1;
if(pos<=mid)add(ls[t],l,mid,pos);
else add(rs[t],mid+1,r,pos);
}
int find(int t,int x){
int p=query(t,1,n,x);
if(x==val[p])return p;
return find(t,val[p]);
}
int main(){
scanf("%d%d",&n,&m);
build(rt[0],1,n);
for(int i=1;i<=m;i++){
int op,x,y;scanf("%d",&op);
if(op==1){
rt[i]=rt[i-1];
scanf("%d%d",&x,&y);
int fax=find(rt[i],x);
int fay=find(rt[i],y);
if(val[fax]==val[fay])continue;
if(dep[fax]>dep[fay])swap(fax,fay);
modify(rt[i],rt[i-1],1,n,val[fax],val[fay]);
if(dep[fax]==dep[fay])add(rt[i],1,n,val[fay]);
}else if(op==2){
scanf("%d",&x);
rt[i]=rt[x];
}else if(op==3){
rt[i]=rt[i-1];
scanf("%d%d",&x,&y);
int fax=find(rt[i],x);
int fay=find(rt[i],y);
if(val[fax]==val[fay])printf("1\n");
else printf("0\n");
}
}
return 0;
}


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

  1. Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)

    3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...

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

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

  3. BZOJ 3674 可持久化并查集加强版(主席树变形)

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 2515  Solved: 1107 [Submit][Sta ...

  4. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

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

  5. 2019.01.21 bzoj3674: 可持久化并查集加强版(主席树+并查集)

    传送门 题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性. 思路: 我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩. 可以考虑另外一 ...

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

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

  7. [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky

    思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...

  8. bzoj3673: 可持久化并查集 by zky&&3674: 可持久化并查集加强版

    主席树可持久化数组,还挺好YY的 然而加强版要路径压缩.. 发现压了都RE 结果看了看数据,默默的把让fx的父亲变成fy反过来让fy的父亲变成fx 搞笑啊 #include<cstdio> ...

  9. BZOJ3673 可持久化并查集 by zky 可持久化 并查集

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3673 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...

随机推荐

  1. Gray Code,求格林码

    问题描述: The gray code is a binary numeral system where two successive values differ in only one bit. G ...

  2. 在Jupyter notebook中使用特定虚拟环境中的python的kernel

        在虚拟环境tf中安装完tensorflow后,在虚拟环境tf打开的jupyter里发现只有一个kernel-python3,新建一个文件, import tensorflow as tf ,发 ...

  3. SPA(单页面web应用程序)

    单页web应用(single page web application,SPA),就是只有一张web页面的应用,是加载单个HTML页面并在用户与应用程序交互时动态更新该页面的web应用程序. 浏览器一 ...

  4. placehold.it-在线图片生成器

    placehold的介绍 当我们进行网页设计时,经常会使用各种尺寸的图片.有时候我们用一个固定宽和高的div来进行代替,可是这样的效果不是很明显,而且还要进行各种各样的文字说明:或者我们得从网上寻找各 ...

  5. Java 完美判断字符串中中文字符【中文符号】

    package com.cmc.util; import java.util.regex.Pattern; public class CharUtil { public static void mai ...

  6. JAVA执行带参数的SQL语句

    转自 http://www.cnblogs.com/raymond19840709/archive/2008/05/12/1192948.html

  7. day37 爬虫2(web微信、高性能相关、Scrapy)

    s16day37 爬虫2 参考博客:http://www.cnblogs.com/wupeiqi/articles/6229292.html 课堂代码:https://github.com/liyon ...

  8. python面试题包含基础和Linux操作以及数据库相关

    今天面试了一家公司,感觉表现的不是很好,记录一下面试的试题. python基础部分 python 是一门什么样的语言面向对象的语言有那些,python的面向对象和Java面向对象的区别 Python是 ...

  9. Java复习8.多线程

    Java复习8 多线程知识 20131007 前言: 在Java中本身就是支持多线程程序的,而不是像C++那样,对于多线程的程序,需要调用操作系统的API 接口去实现多线程的程序,而Java是支持多线 ...

  10. sql杂记

    Create procedure 存储过程的声明 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行 ...