首页 > 其他分享 >链式并查集合并(裸板)

链式并查集合并(裸板)

时间:2024-11-06 18:41:21浏览次数:1  
标签:nxt 并查 int 合并 fa 裸板 链式 find

对于操作:将一段元素合并为同类。

在合并 \([l,r]\) 这一段数的时候,其实有很多数本来就在一个并查集里。我们只需要合并若干个还没有合并的并查集,而不需要从 \(l\) 到 \(r\) 一个一个合并。因为只要合并了这几个并查集,效果等价于把 \([l,r]\) 直接合并了。

实现方法:每次记录一个 \(nxt[i]\) 表示第 \(i\)个点后面第一个没有和 \(i\) 合并的点。每次合并的时候直接 $i=nxt[i] $处理即可,最后把 $[l,r] $中所有的 nxt[i] 都赋值为 \(nxt[r]\)。这样的话,两个不同的并查集在这一操作中至多合并一次。
https://codeforces.com/problemset/problem/566/D

#include<bits/stdc++.h>
#define endl '\n'
#define lowbit(x) (x&-x)
using namespace std;
const double pi=acos(-1);
const int N=2e5+5;
int fa[N],nx[N];

int find(int i){
	if(i!=fa[i]) fa[i]=find(fa[i]);//路径压缩
    return fa[i];
}

void join(int u,int v){
    u=find(u);
    v=find(v);
    if(u==v) return;
    if(u<v) swap(u,v);
    fa[v]=u;
}

void solve(){
    int n,q;cin>>n>>q;
    for(int i=1;i<=n+1;i++){
        fa[i]=i;
        nx[i]=i+1;
    }
    while(q--){
        int op;cin>>op;
        int x,y;cin>>x>>y;
        if(op==3){
            x=find(x);
            y=find(y);
            if(x==y) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        if(op==1){
            join(x,y);
        }
        if(op==2){
            int ty=find(y);
            for(int i=x;i<=y;){
                int t=i;
                i=nx[i];
                fa[find(t)]=ty;
                nx[t]=nx[y];
            }
        }
    }
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}



标签:nxt,并查,int,合并,fa,裸板,链式,find
From: https://www.cnblogs.com/TaopiTTT/p/18530830

相关文章

  • 6分钟看懂分子生物学聚合酶链式反应(PCR)
    在现代生物科学中,聚合酶链反应(PCR)是一项革命性的技术,它改变了我们对DNA的认识和应用。无论是在医学诊断、遗传研究,还是在法医科学中,PCR都发挥着至关重要的作用。这期,由全优统计译制的视频带我们一起深入了解PCR的原理及应用。什么是PCR和qPCR?PCR的原理及应用/Theprincip......
  • 【初阶数据结构篇】链式结构二叉树(续)
    文章目录须知......
  • 数据结构 ——— 计算链式二叉树叶子节点的个数以及计算链式二叉树的高度
    目录前言链式二叉树示意图​编辑手搓一个链式二叉树计算链式二叉树的叶子节点个数计算链式二叉树的高度 前言上一章学习了计算链式二叉树的节点个数数据结构———计算链式二叉树节点的个数-CSDN博客接下来学习的是计算链式二叉树叶子节点的个数以及计算链式二叉......
  • 软件架构演变:从单体架构到LLM链式调用
    0前言软件架构——我们数字世界的蓝图——自20世纪中叶计算机时代诞生以来,已经发生了巨大演变。20世纪60年代和70年代早期,以大型主机和单体软件为主导。而今天,数字领域已完全不同,运行在由云计算、API连接、AI算法、微服务和编排平台组成的分布式网络上。软件架构是如何随着岁......
  • 并查集应用:判圈
    并查集应用:判圈Description第一行输入正整数n,m,q表示一个有n个点m条边的无向图。q表示有q次询问。接下来m行有m条边。每行两个u,v属于[1,n]范围的正整数,表示u,v之间有边。接下来q行,每行两个点u,v,属于[1,n]。如果(u,v)这条边已经存在或者如果加入这条边后会产生新的环,则输出......
  • 数据结构 ——— 链式二叉树的前中后序遍历递归实现
    目录前言链式二叉树示意图​编辑手搓一个链式二叉树链式二叉树的前序遍历链式二叉树的中序遍历链式二叉树的后序遍历 前言在上一章学习了链式二叉树的前中后序遍历的解析数据结构———链式二叉树的前中后序遍历解析-CSDN博客接下来要学习的是代码实现链式二叉树......
  • 【C语言学习】7步轻松掌握C语言链式结构,你也能成为高手!与数组说拜拜,链表你好
    ......
  • 并查集
    种类并查集P2024[NOI2001]食物链类似于超级源点,把\(x+n\)丢进集合里,相当于\(x\)对这个集合作了标记,方便维护细节注意\(x\toy\),对于\(y\toz\),会有\(z\tox\)这里会出现自己和自己连边的情况,用\(fa[rt]=0\)的写法需要特判P6008[USACO20JAN]CavePaintingsP主要考察思......
  • 【数据结构】二叉树链式结构的实现
    1.前置说明    在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究......
  • 并查集---Linux发行版的数量
    题目描述Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行......