最后还是去掉异或顺手A了3673,,,

并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦

1:判断是否属于同一集合,我加了路径压缩。

2:直接把跟的值指向root[k]的值破之。

3:输出判断即可。

难者不会,会者不难,1h前我还在膜这道题,现在吗hhh就当支持下zky学长出的题了。

3673:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x=getint()
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
using namespace std;
inline const int getint(){char c=getchar();int k=1,r=0;for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
const int N=2*1E4+10;
struct node{int l,r,f;}T[N*100];
int cnt,root[N],n,m;
inline void update(int l,int r,int &pos,int x,int fa){
T[++cnt]=T[pos]; pos=cnt;
if (l==r) {T[pos].f=fa; return;}
int mid=(l+r)>>1;
if (x<=mid) update(l,mid,T[pos].l,x,fa);
else update(mid+1,r,T[pos].r,x,fa);
}
inline int ask(int l,int r,int pos,int x){
if (l==r) return T[pos].f;
int mid=(l+r)>>1;
if (x<=mid) return ask(l,mid,T[pos].l,x);
else return ask(mid+1,r,T[pos].r,x);
}
inline int un(int &rt,int a,int b){
update(1,n,rt,a,b);
return b;
}
inline int find(int &rt,int y){
int f=ask(1,n,rt,y);
return f==y?y:un(rt,y,find(rt,f));
}
int main(){
read(n); read(m); int fx,fy,x,y,c;
for1(i,1,n) update(1,n,root[0],i,i);
for1(i,1,m){
read(c);
root[i]=root[i-1];
switch (c){
case 1:
read(x); read(y);
fx=find(root[i],x),fy=find(root[i],y);
if (fx!=fy) un(root[i],fx,fy);
break;
case 2:
root[i]=root[getint()];
break;
case 3:
read(x); read(y);
fx=find(root[i],x),fy=find(root[i],y);
printf("%d\n",(fx==fy));
break;
}
}return 0;
}

3674:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x=getint()
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
using namespace std;
inline const int getint(){char c=getchar();int k=1,r=0;for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
const int N=2*1E5+10;
struct node{int l,r,f;}T[N*100];
int cnt,root[N],n,m;
inline void update(int l,int r,int &pos,int x,int fa){
T[++cnt]=T[pos]; pos=cnt;
if (l==r) {T[pos].f=fa; return;}
int mid=(l+r)>>1;
if (x<=mid) update(l,mid,T[pos].l,x,fa);
else update(mid+1,r,T[pos].r,x,fa);
}
inline int ask(int l,int r,int pos,int x){
if (l==r) return T[pos].f;
int mid=(l+r)>>1;
if (x<=mid) return ask(l,mid,T[pos].l,x);
else return ask(mid+1,r,T[pos].r,x);
}
inline int un(int &rt,int a,int b){
update(1,n,rt,a,b);
return b;
}
inline int find(int &rt,int y){
int f=ask(1,n,rt,y);
return f==y?y:un(rt,y,find(rt,f));
}
int main(){
read(n); read(m); int fx,fy,last=0,x,y,c;
for1(i,1,n) update(1,n,root[0],i,i);
for1(i,1,m){
read(c);
root[i]=root[i-1];
switch (c){
case 1:
read(x); read(y); x^=last; y^=last;
fx=find(root[i],x),fy=find(root[i],y);
if (fx!=fy) un(root[i],fx,fy);
break;
case 2:
root[i]=root[getint()^last];
break;
case 3:
read(x); read(y); x^=last; y^=last;
fx=find(root[i],x),fy=find(root[i],y);
printf("%d\n",last=(fx==fy));
break;
}
}return 0;
}

这样就完了,然而只是达神几年前就随手虐的东西,本蒟蒻必须得努力啊!!!

【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之的更多相关文章

  1. 【BZOJ4388】JOI2012 invitation 堆+线段树+并查集(模拟Prim)

    [BZOJ4388]JOI2012 invitation Description 澳洲猴举办了一场宴会,他想要邀请A个男生和B个女生参加,这A个男生从1到A编号,女生也从1到B编号.现在澳洲猴知道n组 ...

  2. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...

  3. bzoj 2733: [HNOI2012]永无乡 -- 线段树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...

  4. YSZOJ:#247. [福利]可持久化线段树 (最适合可持久化线段树入门)

    题目链接:https://syzoj.com/problem/247 解题心得: 可持久化线段树其实就是一个线段树功能的加强版,加强在哪里呢?那就是如果一颗普通的线段树多次修改之后还能知道最开始的线段 ...

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

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

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

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

  7. 【BZOJ】【3673】可持久化并查集 & 【3674】可持久化并查集加强版

    可持久化并查集 Orz hzwer & zyf 呃学习了一下可持久化并查集的姿势……其实并查集就是一个fa数组(可能还要带一个size或rank数组),那么我们对并查集可持久化其实就是实现一个 ...

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

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

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

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

随机推荐

  1. spring加载xml

    加载文件顺序 情形一:使用classpath加载且不含通配符 这是最简单的情形,Spring默认会使用当前线程的ClassLoader的getResource方法获取资源的URL,如果无法获得当前线程 ...

  2. ZOJ 3233 Lucky Number --容斥原理

    这题被出题人给活活坑了,题目居然理解错了..哎,不想多说. 题意:给两组数,A组为幸运基数,B组为不幸运的基数,问在[low,high]区间内有多少个数:至少被A组中一个数整除,并且不被B中任意一个数 ...

  3. SGU 174 Walls

    这题用并查集来做,判断什么时候形成了环即判断什么时候加入的线段两个端点原先是属于同一集合的.对于一个点,有两个坐标x,y,不好做并查集操作,于是要用map来存储,即做成map<node,int& ...

  4. 数据结构Java实现06----中缀表达式转换为后缀表达式

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  5. 用运算符代替if、else

  6. Struts登录

  7. Groovy Spock环境的安装

    听说spock是一个加强版的Junit,今天特地安装了,再把过程给大家分享一下. 首先说明,我的Java项目是用maven管理的. 我用的Eclipse是Kelper,开普勒. 要使用Spock之前, ...

  8. C#中的Decimal类型

    这种类型又称财务类型,起源于有效数字问题.FLOAT 单精度,有效数字7位.有效数字是整数部分和小数部分加起来一共多少位.当使用科学计数法的,FLOAT型会出现很严重的错误.比如 8773234578 ...

  9. C#中的默认访问修饰符

    1.命名空间下的元素的默认访问修饰符 public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员.internal : 同一程序集中的任何代码都可以访问该类型或成员,但 ...

  10. Linux第十一次学习笔记

    异常控制流 异常控制流(ECF)发生在计算机系统的各个层次 在硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序. 在操作系统层,内核通过上下文转换将控制从一个用户进程转移到另一个用户进程. 在 ...