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

0<n,m<=2*10^5  强制在线。

这两题一题都一样,另一题比较水,nm只有2*10^4,允许离线.....

做法很简单,把数组当作可持久化线段树那么维护,每个表示区间的节点都不存东西,每次只要新建log个节点。

我交水的那道过不去,绝望的时候我交了一发加强版居然A了,根据我多年的经验一定是有特殊数据的坑,特判了一波终于过了。

用了启发式合并之后复杂度nlog^2n

#include<iostream>
#include<cstdio>
#define MN 20000000
#define MM 200000
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} int cnt=,n,m,last=,rt[MM+],cc;
struct data{
int x,size;
}s[MM*+];
struct TREE{
int l,r;
data *x;
}T[MN]; void build(int x,int l,int r)
{
if(l==r){T[x].x=&s[l];return;}
int mid=l+r>>;
build(T[x].l=(++cnt),l,mid);
build(T[x].r=(++cnt),mid+,r);
} data*get(int x,int k,int l=,int r=n)
{
if(l==r)return T[x].x;
int mid=l+r>>;
if(k<=mid) return get(T[x].l,k,l,mid);
else return get(T[x].r,k,mid+,r);
} data getfa(int x,int r)
{
data y=*get(r,x),ans=y;
if(!y.x)return (data){x,ans.size};
while(y.x) {ans=y;y=*get(r,y.x);}
return (data){ans.x,y.size};
} void ins(int x,int dep,int k)
{
int l=,r=n;int nx=rt[dep]=++cnt;
while(l<r)
{
int mid=l+r>>;
if(k<=mid)
{
T[nx].r=T[x].r;T[nx].l=++cnt;
nx=T[nx].l;x=T[x].l;r=mid;
}
else
{
T[nx].l=T[x].l;T[nx].r=++cnt;
nx=T[nx].r;x=T[x].r;l=mid+;
}
}
T[nx].x=&s[cc];
} int main()
{
cc=n=read();m=read();
for(int i=;i<=n;i++)s[i]=(data){,};
build(++cnt,,n);rt[]=;
for(int i=;i<=m;i++)
{
int a=read(),b=read()^last;
if(a==)
rt[i]=rt[b];
else
{
int c=read()^last;
if(a==) printf("%d\n",last=(getfa(b,rt[i-]).x==getfa(c,rt[i-]).x)),rt[i]=rt[i-];
else
{
data x=getfa(b,rt[i-]),y=getfa(c,rt[i-]);
if(x.x==y.x){rt[i]=rt[i-];continue;}
if(x.size>y.size)swap(x,y);
s[++cc]=(data){y.x,x.size};ins(rt[i-],i,x.x);
s[++cc]=(data){,x.size+y.size};ins(rt[i],i,y.x);
}
}
}
return ;
}

[bzoj3673/3674可持久化并查集加强版]的更多相关文章

  1. [BZOJ3673&3674]可持久化并查集&加强版

    题目大意:让你实现一个可持久化的并查集(3674强制在线). 解题思路:刚刚介绍了一个叫rope的神器:我是刘邦,在这两题(实际上两题没什么区别)就派上用场了. 正解应该是主席树||可持久化平衡树,然 ...

  2. BZOJ 3674 可持久化并查集加强版(路径压缩版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

  3. BZOJ 3674 可持久化并查集加强版(按秩合并版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

  4. 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  5. bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

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

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

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

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

  8. bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)

    Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...

  9. BZOJ3673/3674:可持久化并查集

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

随机推荐

  1. Webview之H5页面调用android的图库及文件管理

    h5页面打开图片管理器 一般页面在pc打开文件管理器是用 type="file"的代码,可是这在android的webview是无效的,必须为webview设定WebChromeC ...

  2. jvm垃圾收集器总结jdk1.7

    内存 ● 线程私有:程序计数器,虚拟机栈,本地方法栈 ● 线程共享: 方法区,堆 判断存活算法 ● 引用计数法:无法解决循环引用问题. ● 可达性分析算法: 从GCRoot作为起始点,向下搜索,经过的 ...

  3. OSI七层协议模型、TCP/IP四层模型学习笔记

    1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...

  4. Hibernate之深入Hibernate的配置文件

    1.创建Configuration类的对象 Configuration类的对象代表了应用程序到SQL数据库的映射配置.Configuration类的实例对象,提供一个buildSessionFacto ...

  5. ubuntu1604使用源码方式安装ruby2.5.0

    本文介绍ubutntu1604环境下源代码方式安装ruby 版本2.5.0 如果内存小于2G可以开启虚拟内存,下面的命令开启4G虚拟内存 sudo dd if=/dev/zero of=/swap b ...

  6. MySQL/MariaDB中游标的使用

    本文目录:1.游标说明2.使用游标3.游标使用示例 1.游标说明 游标,有些地方也称为光标.它的作用是在一个结果集中逐条逐条地获取记录行并操作它们. 例如: 其中select是游标所操作的结果集,游标 ...

  7. [JCIP笔记] (三)如何设计一个线程安全的对象

    在当我们谈论线程安全时,我们在谈论什么中,我们讨论了怎样通过Java的synchronize机制去避免几个线程同时访问一个变量时发生问题.忧国忧民的Brian Goetz大神在多年的开发过程中,也悟到 ...

  8. SpringBoot的配置文件加载顺序和使用方式

    1.bootstrap.properties bootstrap.properties 配置文件是由"根"上下文优先加载,程序启动之初就感知 如:Spring Cloud Conf ...

  9. 图数据库orientDB(1-1)SQL基本操作

    SQL基本操作 1.新增VerTex CREATE VERTEX V SET name="user01",sex="M",age="25"; ...

  10. leetcode算法:Distribute Candies

    Given an integer array with even length, where different numbers in this array represent different k ...