【题解】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;
} 
相关推荐
东东最爱敲键盘44 分钟前
day7.c++继承
c++
沫璃染墨2 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌2 小时前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习
Tisfy2 小时前
LeetCode 3731.找出缺失的元素:哈希 / 排序
算法·leetcode·哈希算法·排序·哈希表
醉城夜风~2 小时前
(超详细)C++ STL list容器详解:从使用方法到双向链表底层原理全面解析
c++·windows
lucas_AI3 小时前
Q-CueGraph:你的多模态大模型会 zoom,但真的知道该看哪儿吗?
人工智能·算法
烟花落o3 小时前
C++ 从 C 到进阶 ②:引用、inline 、nullptr
c++·引用·inline·nullptr·c++入门
kaixin_啊啊3 小时前
test_机器学习算法学习
学习·算法·机器学习
liulilittle3 小时前
MOE路由:路由(logits: top-k/8)
c++·人工智能·算法·机器学习·llm