前缀和与差分
一维前缀和
#include <iostream> using namespace std; const int N = 1e5 + 10; int a[N], b[N]; int main() { int n, m, l, r; cin >> n >> m; for (int i = 1; i <= n; i ++ ) { cin >> a[i]; } for (int i = 1; i <= n; i ++ ) { b[i] = a[i] + b[i - 1]; } while (m -- ) { cin >> l >> r; cout << b[r] - b[l - 1] << endl; } return 0; }
二维前缀和
#include <iostream> using namespace std; int a[1010][1010], b[1010][1010]; int main() { int n, m, q; scanf("%d%d%d", &n, &m, &q); for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { cin >> a[i][j]; } } for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { b[i][j] = a[i][j] + b[i][j - 1] + b[i - 1][j] - b[i - 1][j - 1]; } } while (q -- ) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); printf("%d\n", b[x2][y2] - b[x1 - 1][y2] - b[x2][y1 - 1] + b[x1 - 1][y1 - 1]); } return 0; }
一维差分
#include <iostream> using namespace std; const int N = 1e5 + 10; int a[N], b[N]; void insert(int l, int r, int c) //重点就是这个insert,当b[i]加上c后 { //实际上a[i]之后的所有数都加上了c b[l] += c; b[r + 1] -= c; //这里是让r+1后的数不要加c } int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i ++ ) { cin >> a[i]; } for (int i = 1; i <= n; i ++ ) { insert(i, i, a[i]); //构造差分数组,a[1] = b[1], a2 = } //b[2] - b[1], a3 = b[3] - b[2]... while (m -- ) { int l, r, c; cin >> l >> r >> c; insert(l, r, c); } for (int i = 1; i <= n; i ++ ) { b[i] += b[i - 1]; } for (int i = 1; i <= n; i ++ ) { cout << b[i] << ' '; } return 0; }
二维差分
#include <iostream> using namespace std; const int N = 1010; int a[N][N], b[N][N]; void insert(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() { int n, m, q; scanf("%d%d%d", &n, &m, &q); for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { scanf("%d", &a[i][j]); } } for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { insert(i, j, i, j, a[i][j]); } } while (q -- ) { int x1, y1, x2, y2, c; scanf("%d%d%d%d%d", &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][j - 1] + b[i - 1][j] - b[i - 1][j - 1]; } } for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { printf("%d ", b[i][j]); } puts(""); } return 0; }