二维前缀和与差分
二维前缀和
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[110][110]; //原二维数组
int ans[110][110]; //前缀和数组
int main(void)
{
int n,m,q;
cin >> n >> m >> q;
int i,j;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
cin >> a[i][j];
ans[i][j] = ans[i][j-1]+ans[i-1][j]-ans[i-1][j-1]+a[i][j];
}
}
while(q--)
{
int x1,y1,x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
int print = ans[x2][y2]-ans[x2][y1-1]-ans[x1-1][y2]+ans[x1-1][y1-1];
cout << print << endl;
}
}
定义一个二维数组ans[n][n];使得数组ans中的每一个元素都是原数组的前缀和。
二维差分
#include <iostream>
#include<cstdio>
using namespace std;
int n , m , q;
int a[110][110] , b[110][110];
void chafen(int x1 , int y1 , int x2 , int y2 , int c)
{
b[x1][y1] += c;
b[x1][y2 + 1] -= c;
b[x2 + 1][y1] -= c;
b[x2 + 1][y2 + 1] += c;
}
int main()
{
cin >> n >> m >> q;
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
cin >> a[i][j];
insert(i , j , i , j , a[i][j]);
}
}
while(q --)
{
int x1 , y1 , x2 , y2 , c;
cin >> x1 >> y1 >> x2 >> y2 >> c;
insert(x1 , y1 , x2 , y2 , c);
}
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
b[i][j] += b[i - 1][j] + b[i][j -1] - b[i - 1][j - 1];
cout << b[i][j];
}
puts("");
}
return 0;
}
引用
参考了部分大佬的博客