HYSBZ 3674: 可持久化并查集加强版——主席树+并查集

2024-04-07 01:08

本文主要是介绍HYSBZ 3674: 可持久化并查集加强版——主席树+并查集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description:
自从zkysb出了可持久化并查集后……
hzwer:乱写能AC,暴力踩标程
KuribohG:我不路径压缩就过了!
ndsf:暴力就可以轻松虐!
zky:……

n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
请注意本题采用强制在线,所给的a,b,k均经过加密,加密方法为x = x xor lastans,lastans的初始值为0
0<n,m<=2105 0 < n , m <= 2 ∗ 10 5

Sample Input
5 6
1 1 2
3 1 2
2 1
3 0 3
2 1
3 1 2
Sample Output
1
0
1
每个叶子结点记的是他的父亲信息,finds就和并查集差不多,dep记录的是这个数的深度,比如说,1-2-3-4就是
4,然后加上一个5-6,深度还是4,如果加上的是5-6-7-8,那么他的深度就需要加一,这个就是路径压缩,因为并不需要每次都更新深度,所以记一个flag,题目要求强制在线处理,x^lastans,所以需要异或一下。。。
还有就是一般数组大小开到maxn*25(有时候也有40),否则很容易re,浪费罚时。

#include<iostream>
#include<stdio.h>
using namespace std;
#define maxn 200005
int fa[maxn*25],ls[maxn*25],rs[maxn*25],rt[maxn*25],dep[maxn*25];
int tot,n,m;
void build(int l,int r,int &root)
{root=++tot;if(l==r){fa[root]=l;return ;}int mid=l+r>>1;build(l,mid,ls[root]);build(mid+1,r,rs[root]);
}
void update(int l,int r,int root,int last,int pre,int nex,int flag)
{fa[root]=fa[last];ls[root]=ls[last];rs[root]=rs[last];dep[root]=dep[last];if(l==r){if(flag==0)fa[root]=nex;dep[root]+=flag;return;}int mid=l+r>>1;if(mid>=pre)update(l,mid,ls[root]=++tot,ls[last],pre,nex,flag);elseupdate(mid+1,r,rs[root]=++tot,rs[last],pre,nex,flag);
}
int query(int l,int r,int root,int q)
{if(l==r)return root;int mid=l+r>>1;if(mid>=q)return query(l,mid,ls[root],q);elsereturn query(mid+1,r,rs[root],q);
}
int finds(int x,int root)
{int fax=query(1,n,root,x);if(fa[fax]!=x)return finds(fa[fax],root);return fax;
}
int main()
{scanf("%d%d",&n,&m);build(1,n,rt[0]);int cas,l,r;int last=0;for(int i=1;i<=m;i++){scanf("%d",&cas);if(cas==1){scanf("%d%d",&l,&r);l^=last,r^=last;rt[i]=rt[i-1];l=finds(l,rt[i-1]);r=finds(r,rt[i-1]);if(fa[l]==fa[r])continue;if(dep[r]<dep[l])swap(l,r);update(1,n,rt[i]=++tot,rt[i-1],fa[l],fa[r],0);if(dep[l]==dep[r]){int now=++tot;update(1,n,now,rt[i],fa[r],fa[r],1);rt[i]=now;}}else if(cas==2){int t;scanf("%d",&t);t^=last;rt[i]=rt[t];}else{scanf("%d%d",&l,&r);l^=last,r^=last;rt[i]=rt[i-1];l=finds(l,rt[i-1]);r=finds(r,rt[i-1]);if(fa[l]==fa[r])printf("1\n");elseprintf("0\n");last=fa[l]==fa[r];}}return 0;
}

这篇关于HYSBZ 3674: 可持久化并查集加强版——主席树+并查集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881290

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)

转自:http://t.51jdy.cn/thread-259-1-1.html 持久层 是一个项目 后台 最重要的部分。他直接 决定了 数据读写的性能,业务编写的复杂度,数据结构(对象结构)等问题。 因此 架构师在考虑 使用那个持久层框架的时候 要考虑清楚。 选择的 标准: 1,项目的场景。 2,团队的技能掌握情况。 3,开发周期(开发效率)。 传统的 业务系统,通常业

Spring 集成 RabbitMQ 与其概念,消息持久化,ACK机制

目录 RabbitMQ 概念exchange交换机机制 什么是交换机binding?Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机RabbitMQ 的 Hello - Demo(springboot实现)RabbitMQ 的 Hello Demo(spring xml实现)RabbitMQ 在生产环境

A bug‘s life 虫子的生活(带权并查集)

题目链接: 2492 -- A Bug's Life (poj.org) 题目描述: 思路: 带权并查集,处理方法基本与食物链(http://t.csdnimg.cn/fSnRr)相同,没什么思维创新 但是一开始WA了几次,有些细节没有注意好,还是需要静下心来,好好分析问题,需要警惕! 参考代码: //#include<bits/stdc++.h>#include<iostream

三、MyBatis实践:提高持久层数据处理效率

三、MyBatis实践:提高持久层数据处理效率 目录 一、Mybatis简介 1.1 简介1.2 持久层框架对比1.3 快速入门(基于Mybatis3方式) 二、MyBatis基本使用 2.1 向SQL语句传参 2.1.1 mybatis日志输出配置2.1.2 #{}形式2.1.3 ${}形式 2.2 数据输入 2.2.1 Mybatis总体机制概括2.2.2 概念说明2.2.3 单个简单类型

使用MyBatis Generator自动代码生成器简化Java持久层开发

在Web开发中,数据访问层(DAO层)的编码工作往往重复且繁琐,尤其是在处理数据库表与Java对象之间的映射时。MyBatis Generator是一款强大的代码生成工具,它能自动生成DAO接口、Mapper XML文件和实体类,极大地提升了开发效率。本文将详细介绍如何在Maven项目中集成MyBatis Generator,并通过一个示例演示其配置过程。 一、POM.xml中添加MyBatis

05-5.5.3 并查集的进一步优化

👋 Hi, I’m @Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771@qq.com 喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会

深入解析Linux Bridge:原理、架构、操作与持久化配置

一、引言 在计算机网络中,桥接技术扮演着至关重要的角色,它能够实现不同网络设备之间的数据交换与共享。Linux Bridge作为Linux内核提供的一种网络功能,允许用户通过软件方式将多个网络接口桥接在一起,形成一个透明的二层网络。本文将从技术角度深入解析Linux Bridge的原理、架构以及常见的操作方式,并探讨如何实现桥接的持久化配置。 二、Linux Bridge的功能 简单来说,桥

持久化、主从 、分片、哨兵

目录 持久化 RDB(存数据) 使用场景 bgsave 使用方法 原理 AOF(存命令) 使用方法 原理 bgrewriteaof AOF和RDB 主从集群 搭建 数据同步原理(slave宕机) 全量同步 增量同步 集群优化 总结 哨兵机制(master宕机) 机制 监控 自动故障恢复 通知 搭建哨兵集群 RedisTemplate的哨兵模

IOI2000 邮局 加强版 题解

[IOI2000] 邮局 加强版 题解 考虑动态规划,设 f i , j f_{i,j} fi,j​ 为经过了 i i i 个村庄,正在建第 j j j​ 个邮局的最优距离。 以及 w i , j w_{i,j} wi,j​ 表示区间 [ i , j ] [i,j] [i,j]​ 内建一个邮局时的距离总和。 a a a 数组表示每个村庄的坐标编号。 朴素版状态转移方程: f