最后还是去掉异或顺手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. TYVJ1288 飘飘乎居士取能量块 -SilverN

    描述   9月21日,今天是pink的生日,飘飘乎居士当然要去别人的领土大闹一番啦!  为了收集更多的能量到pink家大闹,飘飘乎居士准备从后花园中取出自己多年积攒的p个能量块.后花园一共被划分n个地 ...

  2. 《TCP/IP 详解 卷一》读书笔记 -----第四章 ARP

    1.一个物理层的网络,例如以太网,可以同时被多个不同的网络层所使用.例如网络中的一些主机使用TCP/IP协议,其他主机使用其他的网络协议. 2.设备驱动软件从不关心IP数据报中的目的IP地址.这也是为 ...

  3. javascript中的this应用

    1. this作为全局变量2. 作为对象方法的调用3. 作为构造函数调用4. apply调用 this是Javascript语言的一个关键字.它代表函数运行时,自动生成的一个内部对象,只能在函数内部使 ...

  4. 数据结构Java实现03----单向链表的插入和删除

    文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定)            概念: 链式存储结构是基于指针实现的.我们把一个数据 ...

  5. Auto Clear Unity Console Log

    功能 可以在Editor模式下执行,当然也可以Runtime模式下执行,自动清除 Console的log信息 功能需求 当在制作Editor的一些功能时,常常需要手动的点击Console窗口的Clea ...

  6. Bluestacks 使用

    Bluestack介绍 一款能够在PC模拟Android的好用模拟器 官网:http://www.bluestacks.cn/ 早在2012年就使用上它了,但一直未发现他的许多优点,在使用过其它的两款 ...

  7. 查询OOP课程

    --检测有没有名称为MySchool的数据库 use master if exists (select * from sysdatabases where name='myschool') begin ...

  8. BFGS方法

    今天看了 Nocedal 写的Numerical Optimization 中关于BFGS方法的介绍. BFGS方法有个近亲,叫做DFP方法.下面先介绍DFP方法. 这个方法的意图是找一种方法对Hes ...

  9. poj 1163 The Triangle

    The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43809   Accepted: 26430 De ...

  10. [py]编码 Unicode utf-8

    什么是字符集 在介绍字符集之前,我们先了解下为什么要有字符集.我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流.那么在这两者之间的转换规则就需要一个统一的标准,否 ...