BZOJ 3674 可持久化并查集
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 可持久化并查集的更多相关文章
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- BZOJ 3674 可持久化并查集加强版(按秩合并版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- BZOJ 3674 可持久化并查集加强版(主席树变形)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [Submit][Sta ...
- bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)
Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- bzoj 3674 可持久化并查集加强版——可持久化并查集
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3674 用主席树维护 fa[ ] 和 siz[ ] .改 fa[ ] 和改 siz[ ] 都 ...
- BZOJ 3674: 可持久化并查集加强版
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3674 题意:三种操作:(1)合并ab所在集合:(2)查询ab是否在一个集合:(3) ...
- BZOJ 3674 可持久化并查集加强版 可持久化并查集
题目大意:同3673 强制在线 同3673 仅仅只是慢了一些0.0 这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include<cs ...
- BZOJ 3674: 可持久化并查集模板
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...
随机推荐
- Sql Server 获取本周周一
SELECT DATEADD(Day,(@i+1)-(DATEPART(Weekday,getdate())+@@DATEFIRST-1)%7,getdate())
- 黏包现象之TCP
老师的博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5 server #_*_coding:gbk*_ from socket ...
- requests 进阶用法学习(文件上传、cookies设置、代理设置)
一.文件上传 1.模拟网站提交文件 提交此图片,图片名称:timg.jpg import requests files={ 'file':open('timg.jpg','rb') } respons ...
- HBase源码实战:BufferedMutator
/** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agr ...
- 2018/05/14 03:56:10 [error] 12959#0: *42285845507 client intended to send too large body: 1664288 bytes
Syntax: client_max_body_size size; Default: client_max_body_size 1m; Context: http, server, location ...
- python小白——进阶之路——day2天-———变量的缓存机制+自动类型转换
# ###同一文件,变量的缓存机制 ''' -->Number 部分 1.对于整型而言,-5~正无穷范围内的相同值 id一致 2.对于浮点数而言,非负数范围内的相同值 id一致 3.布尔值而言, ...
- Java HttpURLConnection发送post请求示例
public static Map<String, Object> invokeCapp(String urlStr, Map<String, Object> params) ...
- Pandas 把数据写入csv
Pandas 把数据写入csv from sklearn import datasets import pandas as pd iris = datasets.load_iris() iris_X ...
- 【转】localStorage使用总结
原文地址:https://www.cnblogs.com/st-leslie/p/5617130.html 一.什么是localStorage.sessionStorage 在HTML5中,新加入了一 ...
- 小小知识点(五)——MATLAB对复数的操作
MATLAB程序 a=3+4*i %复数 real(a) %求复数的实部 imag(a) %求复数的虚部 abs(a) %求复数的模 angle(a) %求复数的相位 conj(a) %求复数的复共轭 ...