最后还是去掉异或顺手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. 对于大学4年的反思(续),记我的ThoughtWorks面试

    之前我写了一篇对于大学四年的反思,时隔一个月,为什么我这么快就要来写这篇续章呢?主要有两个原因,第一是感谢静子姐姐,记得知乎上有个回答里面说过人生需要有贵人的帮助,遇到贵人是一件很幸运的事情.我想,静 ...

  2. 二分法 organ Saltless

    organ [描述] 现在某组织中(记作R)有n个人,他们的联络网形成一棵以Saltless为根的树,有边相连代表两人可以直接联络. 每个人有一个代号,Saltless代号为1,且除Saltless外 ...

  3. UESTC 878 温泉旅馆 --性质+枚举

    设FA为A的牌中数字异或和,FB为B的. 则有性质: ans = (所有的(A&B=0)个数 + (FA=FB且A&B=0)的个数)/2.即所有的FA>FB的个数(除2是因为这里 ...

  4. UVA 562 Dividing coins --01背包的变形

    01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostre ...

  5. Spring AOP 注解和xml实现 --转载

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  6. 【hibernate】<第二节>hibernate的一对多映射(基本类型)

    所需工具与前文一致! 第一部分内容:基本类型的一对多(one to many) 以部门表与员工表为例: 目录结构: hibernate.cfg.xml内容 <?xml version=" ...

  7. MVC4 WebAPI POST数据问题

    api [HttpPost] public string PostAvartos(Test model) { if (model != null) { LoggerHelper.WriteInfo(m ...

  8. MySQL学习指引

    mysql指引 1,mysql基本安装 2,mysql多实例安装与维护 3,备份恢复 备份数据库 分备数据库 分备表 恢复数据库

  9. 在ASP.Net和IIS中删除不必要的HTTP响应头

    引入 每次当浏览器向Web服务器发起一个请求的时,都会伴随着一些HTTP头的发送.而这些HTTP头是用于给Web服务器提供一些额外信息以便于处理请求.比如说吧.如果浏览器支持压缩功能,则浏览器会发送A ...

  10. Ant 执行 YUICompressor

    Ant 执行 YUICompressor 任务压缩 JavaScript 和 CSS 文件,解决中文乱码问题,增加源文件字符编码集设定 标签: javascriptantcss任务encodingnu ...