当前位置: 首页 > news >正文

倍增并查集学习笔记

学完板子即可开始水紫题


倍增并查集,可以在 \(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.zskr.cn/news/21078.html

相关文章:

  • ZR 2025 NOIP 二十连测 #1
  • work1
  • 分布式秒杀系统设计方案 - 实践
  • 完整教程:面向.NET开发者:Prosys OPC UA .NET SDK 全面解析
  • 安装devc++过程的分享以及问题的记录
  • zlog1
  • DBA | MySQL 数据库基础用户和信息权限管理实践
  • 2025 年生态格宾网厂家推荐榜:格宾网石笼/格宾网护坡/格宾网挡墙/格宾网网箱厂家推荐,聚焦工程安全与生态保护,助力基建项目高效落地
  • Flink 有状态流处理State、Keyed State、Checkpoint、对齐/不对齐与生产实践 - 实践
  • C++STL之stack,queue与容器适配器 - 教程
  • 2025年氧化镁厂家最新推荐排行榜,电工级/高温/低温/中温/防火电缆/矿物绝缘/熔盐加热器/电热管用/单头管用/合成云母用氧化镁公司推荐!
  • 智能体分析
  • C#——方法的定义、调用与调试 - 详解
  • Redis:高性能内存数据库的六大核心优势 - 教程
  • 2025年聚合硫酸铁供应厂家如何选?行业权威指南与成本控制策略?
  • MCP信任遭遇首次野外攻击:通过仿冒Postmark连接器窃取邮件
  • Hyperbeat Earn 套利指南:新手也能玩转 DeFi 赚钱术
  • 如何在AutoCAD中管理GIS属性表?
  • 详细介绍:跨平台UMEDITOR如何实现Word/Excel/PPT的统一格式管理?
  • 2025 年迷你仓厂家行业选购指南:安东易/小型/微型/商用/搬家/装修/电商/恒温迷你仓厂家,聚焦安全与灵活,这份优质厂商推荐榜请收好
  • 连锁餐饮拓展微信业务:试错 3 个月,终于找到靠谱方案
  • 从零开始掌握 uv:新一代超快 Python 项目与包管理器(含 Windows 支持) - 实践
  • HyperWorks许可证与其他软件的卓越集成
  • 深入理解C++中的字符编码问题:从原理到实践 - 实践
  • LeetCode热题--207. 课程表--中等 - 教程
  • 杰理GPIO状态设置
  • 深入理解 AbstractQueuedSynchronizer(AQS):构建高性能同步器的基石 - 指南
  • 2025 年清洗机厂家最新推荐:高压清洗机、超声波清洗机等多类型设备企业品牌权威榜单,帮企业高效筛选优质清洗设备
  • 从零开始:用C#开发的海量文件内容秒搜神器TDSContent——免费开源高效办公必备!
  • 2025 旋转蒸发仪选型指南:适配科研与生产需求的优质厂家 TOP5 推荐