倍增并查集学习笔记

news/2025/10/14 20:14:34/文章来源:https://www.cnblogs.com/huangems/p/19141922

学完板子即可开始水紫题


倍增并查集,可以在 \(O(m log^2 n)\) 的时间复杂度内求解 \(m\) 个诸如此类的合并问题:

\[\forall \,\,\,\,\, 0 \leq i \leq k \, , \, merge(x+i,y+i) \]

就真的是倍增和并查集的结合体,而不像 \(dsu\,on\,tree\) 那样挂个名头

对于这一类问题,我们可以考虑把合并区间进行二进制拆分

給所有长度为 \(2^i\) 的区间开一个并查集(以下统一称为 \(i\) 级并查集)

代表若在 \(i\) 级的并查集中,元素 \(u,v\) 属于同一连通块,则

\[\forall \,\,\,\,\, 0 \leq i < 2^i \, , \, x+i,y+i \text{在同一连通块中} \]

显然这样的东西非常好维护

再考虑最后怎么把它转成正常并查集的样子

若我想把第 \(i\) 级的并查集传到第 \(i-1\) 级,若 \(p\)\(i\) 级并查级中 \(q\) 的祖先,那么在 \(i-1\) 级并查集中应执行以下操作:

\[merge(q,p),merge(q+2^{i-1},p+2^{i-1}) \]

操作大多数都和 \(st\) 表差不多

luogu P3295

CODE
#include<bits/stdc++.h>
#define usetime() (double)clock () / CLOCKS_PER_SEC * 1000.0
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const int mod=1e9+7;
void read(int& x){char c;bool f=0;while((c=getchar())<48) f|=(c==45);x=c-48;while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;x=(f ? -x : x);
}
int find_f(int u,int* f){if(f[u]==u) return u;else return f[u]=find_f(f[u],f);
}
void merge(int u,int v,int* f){u=find_f(u,f),v=find_f(v,f);if(u!=v) f[u]=v;
}
int n,m;
int f[21][maxn];
int main(){read(n),read(m);int l1,r1,l2,r2;for(int i=1;i<=n;i++){for(int j=0;j<=20;j++){f[j][i]=i;}}for(int i=1;i<=m;i++){read(l1),read(r1),read(l2),read(r2);for(int j=20;j>=0;j--){if(l1+(1<<j)-1<=r1){merge(l1,l2,f[j]);l1+=(1<<j),l2+=(1<<j);}}}for(int i=20;i>=1;i--){for(int l=1,r=(1<<i);r<=n;l++,r++){int tar=find_f(l,f[i]);merge(l,tar,f[i-1]),merge(l+(1<<(i-1)),tar+(1<<(i-1)),f[i-1]);}}int av=find_f(1,f[0]);LL ans=1;for(int i=1;i<=n;i++){//cout<<find_f(i,f[0])<<' ';if(i==f[0][i]){if(f[0][i]==av) ans=ans*9%mod;else ans=ans*10%mod;}}//cout<<endl;printf("%lld",ans);return 0;
}
//^o^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两数相加-leetcode

题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外…

CF2147E

给定 \(n\) 个数和 \(q\) 次查询,每次查询给定 \(k\),问最多进行 \(k\) 次以下操作后 \(n\) 个数按位或的 popcount 最大值。 令 \(ans_i\) 表示使得 \(popcount \ge i\) 至少需要几次操作,显然 \(ans_i\) 单调不降…

线程共享区域

线程共享区域🔴 线程共享区域 (Thread-Shared Areas) #JVM/线程共享区域 🔴 特点:所有线程共享同一个内存区域,需要考虑线程安全问题,是垃圾回收的主要工作区域 🔴 1. Java堆 (Java Heap) #JVM/Java堆 🔴 定…

ZR 2025 NOIP 二十连测 #1

100 + 0 + 30 + 0 = 130, Rank 72/133.大模拟!/tuu25noip二十连测day1 链接:link 题解:题目内 时间:4.5h (2025.10.14 07:40~12:10) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\)*1200估分:100 + 0 + 30 + 0 =…

work1

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 学号:102500331 姓名:余武 安装过程:安装成功:代码结果:

2025 年液压机厂家推荐榜:伺服/小型/大型/数控/液压机厂家口碑推荐,品质可靠 聚焦智能适配,助力企业高效生产

随着制造业智能化升级、产品精度要求提升及生产效率优化需求增加,液压机作为关键成型设备,已从传统重工业领域逐步延伸至汽车零部件、五金制品、粉末冶金、电子元件等多个细分行业,2025 年市场规模预计持续扩大。但…

快速上手!山海鲸 4 种高频数据接入方式

在数据可视化实践中,“数据能顺畅接入” 是大屏发挥价值的前提。山海鲸数据可视化大屏针对不同业务场景与数据形态,推出了 4 种高频使用的数据接入方式,既降低了技术门槛,又保障了数据对接的稳定性与时效性,以下为…

AI4S Cup学习赛 - 超导体临界温度预测

AI4S Cup学习赛 - 超导体临界温度预测https://www.bohrium.com/competitions/3521345283?tab=mine

2025高级语言程序设计第一次作业lcr

班级链接:https://edu.cnblogs.com/campus/fzu/gjyycx 作业要求链接:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 我的学号:102500417 我的名字:刘朝榕 1.安装dev-c++2.成功安装好dev-c++3.编写示例…

D230809E. 勇敢的阿乐

题意: 一个 包含 \(n\) 个点 \(m\) 条边的简单无向连通图。现在,删掉其中的一些边让度数为奇数的点尽可能多。 输出要删掉哪些边, 用一个长为 \(m\) 的 01串 表示, 第 \(i\) 位为 \(1\) 表示不删第 \(i\) 条边, 为 \…

完整教程:面向.NET开发者:Prosys OPC UA .NET SDK 全面解析

完整教程:面向.NET开发者:Prosys OPC UA .NET SDK 全面解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

分布式秒杀系统设计方案 - 实践

分布式秒杀系统设计方案 - 实践2025-10-14 19:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

高级程序语言第一次作业

这个作业属于哪个课程:高级语言程序设计 这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 学号:102500434 姓名:王志勇 一:dev-c++的安装:注意设置相关要求,安装正常。二:代码的…

安装devc++过程的分享以及问题的记录

课程:https://edu.cnblogs.com/campus/fzu/gjyycx 作业要求 https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 学号:102500330 姓名:黄明浩1.解压压缩文件,进行的还算顺利,将程序存放到了一个全英文目录…

Linux之线程池 - 指南

Linux之线程池 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

LlamaIndex检索调优实战:分块、HyDE、压缩等8个提效方法快速改善答案质量

分块策略、混合检索、重排序、HyDE、上下文压缩、元数据过滤、自适应k值——八个实用技巧快速改善检索质量 RAG系统答不准问题,本质上是检索精度的问题。LlamaIndex本身提供的调优空间还挺大,不用推翻重写就能把准确…

zlog1

一、python的基本语法 1.常见的数据类型:整数(int)【1,2,3】、浮点数(float)【1.1,1.2,1.3】、字符串(str)【abc, hello】、布尔值(bool)【0,1 (True=1,False=0)】、列表(list)【[1.2,3]】、元组(tuple)、字典(dic…

Spring Boot 3.x 制作 Starter 快速上手体验,通过实践理解自动装配原理

Spring Boot 3.x 制作 Starter 快速上手体验,通过实践理解自动装配原理2025-10-14 19:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

动火作业风险早预警!AI + 热成像技术筑牢防火安全线

动火作业(焊接、切割、喷灯使用等)的安全管理,长期受限于技术瓶颈与监管盲区:人工巡检难实时判断动火点周边是否存在易燃物,更无法精准测量易燃物与动火点的安全距离;AI 视觉技术因无法识别物体材质,难以界定 “…

DBA | MySQL 数据库基础用户和信息权限管理实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …