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

用可持久化数组维护并查集的fa数组,

查询时间复杂度为nlognlogn,一个log是并查集的时间复杂度,采用按秩合并的操作,需要注意的是按秩合并的秩意思为当前最大结点下的树的最大深度。

另一个log是主席树查询的时间复杂度

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){int x = ,f = ;char c = getchar();while (c<'' || c>''){if (c == '-') f = -;c = getchar();}
while (c >= ''&&c <= ''){x = x * + c - '';c = getchar();}return x*f;}
const double eps = 1e-;
const int maxn = 2e5 + ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,K;
int T[maxn],tot;
struct Tree{
int lt,rt;
int fa,size;
}tree[maxn * ];
int fa[maxn],Size[maxn];
void newnode(int &t){
t = ++tot;
tree[t].lt = tree[t].rt = tree[t].fa = ;
}
void Build(int &t,int l,int r){
newnode(t);
if(l == r){
tree[t].fa = l;
tree[t].size = ;
return;
}
int m = l + r >> ;
Build(tree[t].lt,l,m); Build(tree[t].rt,m + ,r);
}
int query(int t,int l,int r,int x){
if(l == r){
Size[x] = tree[t].size;
return tree[t].fa;
}
int m = l + r >> ;
if(x <= m) return query(tree[t].lt,l,m,x);
else return query(tree[t].rt,m + ,r,x);
}
void update(int &t,int pre,int l,int r,int x){
newnode(t);
tree[t] = tree[pre];
if(l == r){
tree[t].fa = fa[x];
tree[t].size = Size[x];
return;
}
int m = l + r >> ;
if(x <= m) update(tree[t].lt,tree[pre].lt,l,m,x);
else update(tree[t].rt,tree[pre].rt,m + ,r,x);
}
int find(int id,int x){
int f = query(T[id],,N,x);
if(f == x) return x;
return find(id,f);
}
int main(){
//freopen("C.in","r",stdin);
Sca2(N,M);
Build(T[],,N);
int ans = ;
for(int i = ; i <= M; i ++){
int op = read();
if(op == ){
int a = read() ^ ans,b = read() ^ ans;
a = find(i - ,a); b = find(i - ,b);
if(Size[a] > Size[b]) swap(a,b);
fa[a] = b;
update(T[i],T[i - ],,N,a);
if(Size[a] == Size[b]){
Size[b]++; fa[b] = b;
int x;
update(x,T[i],,N,b);
T[i] = x;
}
}else if(op == ){
int k = read() ^ ans;
T[i] = T[k];
}else if(op == ){
T[i] = T[i - ];
int a = read() ^ ans,b = read() ^ ans;
a = find(i,a); b = find(i,b);
ans = (a == b);
if(a == b) puts("");
else puts("");
} }
return ;
}

BZOJ 3674 可持久化并查集的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. bzoj 3674 可持久化并查集加强版——可持久化并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3674 用主席树维护 fa[ ]  和 siz[ ] .改 fa[ ] 和改 siz[ ] 都 ...

  7. BZOJ 3674: 可持久化并查集加强版

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3674 题意:三种操作:(1)合并ab所在集合:(2)查询ab是否在一个集合:(3) ...

  8. BZOJ 3674 可持久化并查集加强版 可持久化并查集

    题目大意:同3673 强制在线 同3673 仅仅只是慢了一些0.0 这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include<cs ...

  9. BZOJ 3674: 可持久化并查集模板

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...

随机推荐

  1. PowerDesigner 使用教程(很具体,很实用)

    原文地址为:PowerDesigner 使用教程(很具体,很实用) 1.PowerDesigner 使用教程 从今日开始,每天一部分内容,在每个工作日,争取让大家天天都有的看,每天内容不会太多. 有错 ...

  2. 【原】Java学习笔记011 - 数组

    package cn.temptation; import java.util.Scanner; public class Sample01 { public static void main(Str ...

  3. iOS证书配置与管理

    证书: 证书: 命名 特点 团队管理 开发证书 iOS Development 不与App ID对应 表示拥有开发应用的资格 一般只需一个,通过导出p12文件,分发给其他电脑安装: 生产证书 iOS ...

  4. PowerDesigner表设计中的P F M分别代表什么意思?

    版本 如下图中的P.F.M代表什么意思呢? P即primary,主键的意思 F即foreign key,外键的意思 M即mandatory,强制不可为空的意思

  5. Git与SVN交叉使用

    将本地git项目添加到远程svn中 git svn [svnprojpath] svnprojpath为原创svn项目路径 -- 文件夹路径,你要放到哪个文件夹 官方文档中带有-s参数,但我这边加了会 ...

  6. 日志学习系列(二)——Log4net的实例

    一.log4net简单实例创建步骤如下 1.第一步:在项目中添加对log4net.dll的引用,这里引用版本是2.0.8.0 2.第二步:程序启动时读取log4net的配置文件. 读取log4net的 ...

  7. ubuntu创建idea桌面快捷方式

    This method can be used to create a launcher for any application, not just IntelliJ IDEA. For any la ...

  8. axios请求本地的json文件在打包部署到子目录域名下,路径找不到

    前言: 因为要同时部署两个项目,有一个是部署到域名下面的子目录下,如:https://xxx.com/siot-admin vue 项目中使用axios请求了本地项目的static文件夹下的json文 ...

  9. SQL Server百万级大数据量删除

    删除一个表中的部分数据,数据量百万级. 一般delete from 表 delete from 表名 where 条件: 此操作可能导致,删除操作执行的时间长:日志文件急速增长: 针对此情况处理 de ...

  10. flask token认证

    在前后端分离的项目中,我们现在多半会使用token认证机制实现登录权限验证. token通常会给一个过期时间,这样即使token泄露了,危害期也只是在有效时间内,超过这个有效时间,token过期了,就 ...