前缀和与差分习题
时间: 2025-05-17 09:03:04 浏览: 25
### 关于前缀和与差分算法练习题
#### 一维前缀和经典习题
以下是几道经典的涉及一维前缀和的编程题目:
1. **区间查询问题**
题目描述:给定一个长度为 $N$ 的数组,执行多次询问操作,每次询问给出两个整数 $L$ 和 $R$,返回该区间的元素和。
解决方法:通过构建前缀和数组 `s` 来快速计算任意区间的和。具体实现可以参考以下代码片段:
```cpp
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
long long a[N], s[N];
int main() {
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + a[i]; // 构建前缀和
while (q--) {
int l, r;
cin >> l >> r;
cout << s[r] - s[l - 1] << endl; // 查询[L,R]区间的和
}
return 0;
}
```
2. **频繁修改与查询**
题目描述:对于一个初始全零的数组,支持两种操作:一是单点更新某个位置的值;二是查询某一段区间的总和。
这类问题可以通过差分数组来优化批量更新操作的时间复杂度[^3]。
---
#### 差分的经典应用
差分的核心思想在于将范围内的加减转化为端点上的增减,从而减少重复计算量。下面是一些典型场景的应用实例:
1. **区间增加问题**
题目描述:给定一个长度为 $N$ 的数组,有若干次操作,每种操作指定一个区间 `[L, R]` 并对该区间中的所有元素加上同一个常数值 $C$。最终输出整个数组的状态。
实现方式:利用差分数组记录增量变化,在最后还原原始数据时累加这些差异即可得到目标状态。
```cpp
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5 + 5;
long long diff[MAX_N];
void apply_update(int L, int R, int C){
diff[L] += C;
if(R + 1 < MAX_N) diff[R + 1] -= C;
}
vector<long long> get_final_array(int size){
vector<long long> result(size);
long long current_sum = 0;
for(int i=0;i<size;++i){
current_sum += diff[i];
result[i] = current_sum;
}
return result;
}
int main(){
int length, num_operations;
cin>>length>>num_operations;
memset(diff, 0, sizeof(diff));
for(int op=0;op<num_operations;op++){
int start,end,value;
cin>>start>>end>>value;
apply_update(start, end, value);
}
auto final_result=get_final_array(length);
for(auto val : final_result){
cout<<val<<" ";
}
return 0;
}
```
---
#### 二维前缀和扩展
当面对矩阵形式的数据结构时,同样可以用类似的思路解决更复杂的多维度统计需求。比如求解矩形区域内的像素亮度平均值等问题都可以借助二维前缀和高效完成。
公式表达如下所示:
$$ \text{prefix}[x][y] = A[x][y]+\text{prefix}[x-1][y]+\text{prefix}[x][y-1]-\text{prefix}[x-1][y-1] $$
其中 $\text{A}$ 表示源图像,$\text{prefix}$ 则存储累积的结果用于加速后续访问过程[^2]。
---
### 总结
以上列举了几类围绕着前缀和与差分展开的基础训练项目及其解决方案框架。希望对你有所帮助!
阅读全文
相关推荐




















