前缀和快速应用
s[i] += s[i - 1]; //构建前缀和
使用方法:区间求和[2,5] = s[5]-s[2-1]=s[1]
二维构建
m[i][j] = m[i-1][j] + m[i][j-1] - m[i-1][j-1] + x;
s =m[x2][y2]-m[x1-1][y2]-m[x2][y1-1]+m[x1-1][y1-1];
差分数组快速应用
b[i] = s[i] - s[i - 1]; //构建差分数组
精髓是差分数组的前缀和是原数组
作用是:将一个原数组区间内的数字同时改变,对b数组求前缀和就可以了得到改变后的原数组
使用方法:对原数组[l,r]进行区间加减数操作的重点是
b[l] += c; //将序列中[l, r]之间的每个数都加上c
b[r + 1] -= c;
右边后一位要减去一个东西,因为多了
#include<iostream>
using namespace std;
int n[5] = { 0,2,5,6,3 };
int main() {
int s[6] = { 0 };
int b[6] = { 0 };
for (int i = 1; i <= 5; i++) {
cin >> s[i];
b[i] = s[i] - s[i - 1]; //构建差分数组
}
for (int i = 1; i <= 5; i++)
cout << "s[i]=" << s[i] << " ";
puts(" ");
int a[6] = { 0 };
//前缀和
for (int i = 1; i <= 5; i++) {
a[i] = a[i - 1] + s[i];
}
for (int i = 1; i <= 5; i++)
cout << "a[i]=" << a[i] << " ";
puts(" ");
//方法2 s[i]+=s[i-1];
for (int i = 1; i <= 5; i++)
s[i] += s[i - 1];
for (int i = 1; i <= 5; i++)
cout << "a1[i]=" << s[i] << " ";
puts(" ");
cout << "区间的和【2,3】=s[3]-s[2-1]=" << s[3] - s[2 - 1] << endl;
//s数组是b数组的前缀和数组
cout << "s数组是b数组的前缀和数组 差分数组:" << endl;
for (int i = 1; i <= 5; i++)
cout << "b[i]=" << b[i] << " ";
puts(" ");
}