#创作计划#C++前缀和与差分
2025-08-20 20:39:51
发布于:广东
Markdown代码2616字,渲染出实际1934字
前言
前缀和和差分是优化的常见手段。
本篇很水
前缀和
假设有一个数组,现在要对到进行求和。
假设,那么求和的操作:
首先新建两个变量:用于记录和,用于求和操作。
接下来将加上指向的值,并将i右移:
继续累加并右移:
到达,累加并结束。
最终答案:
可以发现,这里的方法如果用代码实现,时间复杂度很高(),如果题目给到的数据大一点就会爆。
这个时候,就可以使用前缀和来优化代码,实现的时间复杂度。
新建一个数组,表示数组前项的值,即。
依旧是求区间和:
这段区间的区间和是,刚好等于。
验证答案:。答案正确!
也就是说,到的区间和为。
那么如何在程序中快速生成前缀和数组呢?
我们可以注意到,只比多一个,如:
得出:。
程序实现
for(int i = 1;i <= n;i++){//输入
cin >> a[i];
s[i] = a[i-1]+s[i];
}
cin >> l >> r;//输出
cout << s[r]-s[l-1];
一个小特性:当
i=1
,程序内s[1]=s[0]+a[1]
,如果s
为全局变量则s[0]
等于0
,s[1]
直接等于a[1]
。
差分
有一个数组,现在要将数组中从到区间的数全部加上。
常规暴力实现:假设,定义一个。
将指向的数加上,并将:
继续操作:
到达,最后一次操作指向的元素加上,循环结束。
结束后的数组:
这个方法的时间复杂度依然是。
要优化这里的代码,可以使用差分。
差分适用于有多次区间加减的题目,单次加减甚至会负优化(到)
增加差分数组:
其中。
对于每次操作,将加上,减去.
解释:增大的值会增大的值,而到区间内的值由于一起加减,差分数组不变。
增大的值会减小的值,所以减去。
此处假设只有正数。
最后,给数组做一个前缀和得到原数组。
解释:。
代码实现:
int n,q,d[12];
cin >> n >> q;//n为数组大小,q为操作次数
int tmp = 0;
for(int i = 1;i <= n;i++){
int x;cin >> x;
d[i] = x-tmp;
tmp=x;
}
while(q--){
int l,r,t;cin >> l >> r >> t;
d[l]+=t;
d[r+1]-=t;
}
tmp=0;
for(int i = 1;i <= n;i++){
int x = tmp += d[i];
cout << x << endl;
tmp=x;
}
因为差分只需要和来构造,因此不创建,只用变量存储即可。
结尾
到这里就结束了前缀和和差分的解释和一维实现。二维正在赶工······
这里空空如也
有帮助,赞一个