#include<iostream>
#include<algorithm>
using namespace std;
int b[100] = { 0 }, a[100] = { 0 };
int sum[100];
//初始值为0
void add(int l, int r, int v) {
b[l] += v;
b[r + 1] += v;
}//0,0,5,0,0,-5 .
// 3,0,5,0,0,-8.
//差分改 b[l]+=v, b[r+1]-=v
//即仅在l到r之间加v
//前缀和
int get_sum(int l, int r) {
if (l != 0) return sum[r] - sum[l - 1];
else return sum[r]; //即从0到r的和
}
//#define get_sum(int l,int r) (l?sum[r]-sum[l-1]:sum[r])
//求区间和
int main()
{
a[5] = {1,2,3,4,5 };
for (int i = 1;i < 5;i++) {
sum[i] = sum[i - 1] + a[i];
}
int s=get_sum(2, 4); //求第2个到第4个的和
//差分
add(2, 4, 5);//在2到4之间的差值(初值设为0)加5;
add(1, 4, 3); //即b[2]+=5, b[5]-=5
/*for (int i = 1;i < 5;i++) {
b[i] += b[i - 1];
}//改变差值
*/
int sum = 0;
for (int i = 0;i<5;i++)
{
sum += b[i];
a[i] += sum;
}//a为改变后的数组
return 0;
}
二维
#include<iostream>
#include<algorithm>
using namespace std;
const int n = 3, m = 4;
int sum[n][m];
int g[n][m] = {
{1,5,6,8},
{9,6,7,3},
{5,3,2,4}
};
void pre_sum() {
sum[0][0] = g[0][0];
for (int i = 1;i < n;i++)
sum[i][0] = sum[i - 1][0] + g[i][0];
for (int j = 1;j < m;j++)
sum[0][j] = sum[0][j - 1] + g[0][j];
for (int i = 1;i < n;i++)
for (int j = 1;j < m;j++)
sum[i][j] = g[i][j] + sum[i - 1][j] + sum[i][j - 1]
- sum[i - 1][j - 1];
}
int get_sum(int x1, int y1, int x2, int y2) {
if (!x1 && !y1) return sum[x2][y2];
else if (!x1) return sum[x2][y2] + sum[x2][y1 - 1];
else if (!y1) return sum[x2][y2] - sum[x1 - 1][y2];
return sum[x2][y2] - sum[x2][y1 - 1] - sum[x1][y2 - 1] +
sum[x1 - 1][y1 - 1];
}
int main() {
pre_sum();
cout << get_sum(1, 1, 2, 2);
return 0;
}