首页 > 其他分享 >可持久化并查集

可持久化并查集

时间:2023-02-24 09:36:18浏览次数:30  
标签:ver val int 查集 rdep fa rfa 持久

  • 本文因为做题做颓废了于是上B站学了下这玩意

只因本概念

支持回退,访问之前版本。建立在可持久化数组上。

把 fa 数组可持久化

并查集优化

  1. 路径压缩
  2. 按秩合并

因为 fa 数组是用可持久化数组维护的,所以就没法用路径压缩了。

因为每次路径压缩时,fa[x] = find(fa[x]),会修改许多次 fa 数组。而每次修改会再创建一个新版本,因此无法路径压缩。

因为每个版本并查集节点深度可能不同,所以我们还需要新开一个可持久化数组记录每个版本的 dep 数组。

代码乱打

const int N = 2e5 + 10;
struct node
{
    int l, r, val;
}t[N * 40 * 2];

int cnt, rfa[N], rdep[N], tot;

int build(int l, int r)
{
    int p = ++ cnt;
    if(l == r)
    {
        t[p].val = ++ tot;
        return p;
    }
    int mid = l + r >> 1;
    t[p].l = build(l, mid);
    t[p].r = build(mid + 1, r);
    return p;
}

int change(int l, int r, int p, int pos, int val)
{
    int q = ++ cnt;
    t[q] = t[p];
    if(l == r)
    {
        t[q].val = val;
        return q;
    }
    int mid = l + r >> 1;
    if(pos <= mid) t[q].l = change(l, mid, t[p].l, pos, val);
    else t[q].r = change(mid + 1, r, t[p].r, pos, val);
    return q;
}

int query(int l, int r, int p, int pos)
{
    if(l == r) return t[p].val;
    int mid = l + r >> 1;
    if(pos <= mid) return query(l, mid, t[p].l, pos);
    else return query(mid + 1, r, t[p].r, pos);
}

int find(int p, int x)
{
    int fx = query(1, n, rfa[p], x);
    return fx == x ? x : find(p, fx);
}

void merge(int p, int x, int y)
{
    x = find(p - 1, x);
    y = find(p - 1, y);
    if(x == y)
    {
        rfa[p] = rfa[p - 1];
        rdep[p] = rdep[p - 1];
    }
    else
    {
        int depx = query(1, n, rdep[p - 1], x);
        int depy = query(1, n, rdep[p - 1], y);
        if(depx < depy)
        {
            rfa[p] = change(1, n, rfa[p - 1], x, y);
            rdep[p] = rdep[p - 1];
        }
        else if(depx > depy)
        {
            rfa[p] = change(1, n, rfa[p - 1], y, x);
            rdep[p] = rdep[p - 1];
        }
        else
        {
            rfa[p] = change(1, n, rfa[p - 1, x, y]);
            rdep[p] = change(1, n, rdep[p - 1], y, depy + 1)
        }
    }
}

int main()
{
    cin >> n >> m;
    rfa[0] = build(1, n);

    for(int ver = 1; ver <= m; ver ++)
    {
        int op, x, y;
        cin >> op;
        if(op == 1)
        {
            cin >> x >> y;
            merge(ver, x, y);
        }
        else if(op == 2)
        {
            cin >> x;
            rfa[ver] = rfa[x];
            rdep[ver] = rdep[x];
        }
        else 
        {
            cin >> x >> y;
            rfa[ver] = rfa[ver - 1];
            rdep[ver] = rdep[ver - 1];
            int fx = find(ver, x), fy = find(ver, y);
            if(fx == fy) cout << 1 << endl;
            else cout << 0 << endl;
        }
    }
} 

标签:ver,val,int,查集,rdep,fa,rfa,持久
From: https://www.cnblogs.com/crimsonawa/p/17150191.html

相关文章

  • Windows 上 Docker 部署 MongoDb 并构建数据持久化
    拉取镜像老样子先拉取一个镜像。dockerpullmongo:latest运行容器dockerrun-p27017:27017--namemongo-v/d/mongo/data:/data/db-eMONGO_INITDB_ROOT_USERNA......
  • 并查集
    并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。查询(Find):查询两个元素是否在同一个集合......
  • React Native持久化存储
    导入:注意:新版本的ReactNative不再集成async-storagenpminstall@react-native-async-storage/async-storageyarnadd@react-native-async-storage/async-stora......
  • 性能测试-内存溢出(堆溢出、栈溢出、持久代溢出)问题定位和分析【杭州多测师_王sir】【
     1、堆内存溢出1)稳定性压测一段时间后,jmeter报错,日志报java.lang.OutOfMemoryError.Java heap space。2)用jmap -histo pid命令dump堆内存使用情况,查看堆内存排名前......
  • 并查集
    并查集序言:我们大家都是好朋友并查集是一种维护关系的数据结构新手所学的并查集都是维护朋友关系的并查集朋友的朋友是朋友我们可以将变成朋友的点连到同一个集合中......
  • Nacos单机&集群&持久化&nginx代理配置
    目录Nacos是什么注册中心对比环境搭建环境准备Nacos下载运行单机测试特性一:注册中心消费者项目POMYML配置类控制类启动类两个生产者项目POMYML控制类启动类验证特性二:配置......
  • 4、Redis底层原理(持久化+分布式锁)
    Redis底层原理持久化Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久......
  • Kubernetes持久化存储
    一、emptyDir持久化存储配置emptyDir 的一些用途:缓存空间,例如基于磁盘的归并排序。为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。在Web......
  • 浅谈一类多重传递关系的并查集问题
    首先解释一下什么叫“多种传递关系”:普通的并查集只能维护“朋友的朋友是朋友”,而面临“敌人的敌人是朋友”的情况十分乏力,多种传递关系即指“敌人的敌人是朋友”类情况。......
  • Redis的两种持久化方式
    redis的两种持久化方式  摘自:https://www.cnblogs.com/shenStudy/p/16757742.htmlredis的两种持久化方式redis是一个内存数据库,一旦断电或服务器进程退出,内存数据......