【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)

做过类似的题,原来有模板。

【记录】「SCOI2016」三道模拟赛/26.7.12-CSDN博客

这里面的第三道。


cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const LL P = 998244353;
const int N = 5e5 + 10;

LL a[N], ans;
int fa[21][N];
// fa[i][j] 其实并不代表着 [j, j + (1 << i) - 1] 区间的都属于 j 的并查集
// 不然初始化的时候不就直接把区间合并了嘛!
// 其实这不能单独来看,换句话说,只有两个不同的 j
// 在 fa[i] 里都属于一个并查集,才能代表 [j, j + (1 << i) - 1] 和 [j', j' + (1 << i) - 1] 同属
// 这类似于懒标记,但不是向下传递
// 如果这一层两个不同的点并查集相同,那就没有接着往下的必要了 

int findfa(int c, int x) {
	if (fa[c][x] == x) {
		return fa[c][x];
	}
	return fa[c][x] = findfa(c, fa[c][x]);
}

void merge(int C, int x, int y) {
	int tx = findfa(C, x), ty = findfa(C, y);
	if (tx != ty) {
		fa[C][tx] = ty;   // 合并第 C 层的并查集 
		if (C != 0) {
			merge(C - 1, x, y);
			merge(C - 1, x + (1 << (C - 1)), y + (1 << (C - 1)));
		}
		else {
			ans = (ans + a[tx] * a[ty] % P) % P; 
			a[ty] = (a[ty] + a[tx]) % P;   
			 // 只有到最底层才合并 a 数组,因为 a 数组管的是单个 
		}
	}
}

int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int n, Q;
	cin >> n >> Q;
	
	for (int i = 0; i < n; i ++) {
		cin >> a[i];
	}
	
	for (int i = 0; i <= 20; i ++) {
		for (int j = 0; j < n; j ++) {
			fa[i][j] = j;
		}
	}
	
	ans = 0;
	while (Q --) {
		int len, x, y;
		cin >> len >> x >> y;
		if (len == 0) {
			cout << ans << "\n";
			continue;
		}
		
		int lg = log2(len);
		// 1<<(log2(n)) <= n
		// len = 0 时 lg 会等于负数,所以要特判 
		merge(lg, x, y);
		merge(lg, x + len - (1 << lg), y + len - (1 << lg));
		
		cout << ans << "\n";
	}
	
	return 0;
} 
相关推荐
傲世仙尊18 分钟前
继承-类设计层次复用切片转换与菱形继承的死结
c++
架构师伯子明21 分钟前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
LabVIEW开发29 分钟前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
纪念 22944 分钟前
C++算法(六)
开发语言·c++·算法
ShineWinsu1 小时前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
Dumbness2 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
taka2 小时前
从 24x 到 141x:我用纯 Python 零依赖项目,扒开了 GPU 加速的性能黑洞
算法
AI的探索之旅2 小时前
97 个 OpenCV 实例(三十七):二维码识别,一张图四个码的陷阱
c++·opencv·计算机视觉
UIU1142 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
raindayinrain2 小时前
c++设计模式
开发语言·c++·设计模式