1. 根号分治算法深度解析
根号分治(Square Root Decomposition)是一种经典的算法设计思想,它通过巧妙的问题划分,将时间复杂度优化到O(n√n)级别。这种算法特别适合处理那些看似需要O(n²)时间,但实际上可以通过分组优化的场景。
1.1 基本思想与数学模型
根号分治的核心在于找到一个合适的阈值B(通常取√n),将问题划分为"大"和"小"两个类别:
- 对于大集合(大小>B):数量不超过n/B个
- 对于小集合(大小≤B):每个处理时间为O(B)
这种划分保证了无论处理哪一类,时间复杂度都不会超过O(n√n)。数学上可以表示为:
min(B, n/B) ≤ √n
1.2 经典应用场景分析
1.2.1 集合求和问题
考虑多个集合的更新与查询操作,其中集合总大小为O(n)。我们设定阈值B=√n:
- 大集合:直接维护和,更新时使用懒标记
- 小集合:暴力更新元素值
预处理阶段需要计算大集合与其他集合的交集,这一步时间复杂度为O(n√n)。查询时:
- 小集合查询:直接求和O(B)
- 大集合查询:利用预处理结果O(√n)
1.2.2 倍数枚举问题
对于形如"所有x的倍数"这类查询:
- 当x>B时:直接枚举倍数,共O(n/B)个
- 当x≤B时:预处理模x的余数结果
这种技术在题目F. Sum of Progression和F. Remainder Problem中都有典型应用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双指针算法精要
2.1 相向双指针原理
相向双指针(Two Pointers)是一种高效的区间处理技术,特别适合解决有序数组的两数之和类问题。基本框架为:
java复制int l = 0, r = n-1;
while(l < r) {
if(a[l] + a[r] > target) {
// 处理逻辑
r--;
} else {
l++;
}
}
2.2 应用实例:Coloring Game
在题目C. Coloring Game中,我们需要统计满足a[i]+a[j]>max(a[k],a[n]-a[k])的三元组(i,j,k)数量。通过固定k,然后对每个k使用相向双指针处理
