趁着还有10来分钟下课,赶紧上传刚刚写的代码 ^.^
一维前缀和:
#include<iostream> using namespace std; const int N = 100010; int n, m; int arr[N], sum[N]; int main() { cin >> n >> m; for (int i = 1; i < n+1; i++) { cin >> arr[i]; sum[i] = sum[i - 1] + arr[i]; } while (m--) { int l, r; cin >> l >> r; cout << sum[r] - sum[l - 1] << endl; } return 0; }
二维前缀和:
#include<iostream> using namespace std; const int N = 1010; int n, m; int q; int arr[N][N]; int sum[N][N]; int main() { cin >> n >> m >> q; for (int i = 1; i < n + 1; i++) { for (int j = 1; j < m + 1; j++) { cin >> arr[i][j]; sum[i][j] = arr[i][j] + sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1]; } } while (q--) { int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; cout << sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1] << endl; } return 0; }
一维差分:
#include<iostream> using namespace std; const int N = 100010; int n, m; int c; int arr[N]; int d[N]; int sum[N]; int main() { cin >> n >> m; for (int i = 1; i < n + 1; i++) { cin >> arr[i]; } while (m--) { int l, r, c; cin >> l >> r >> c; d[l] += c; d[r + 1] -= c; } for (int i = 1; i < n + 1; i++) { sum[i] = sum[i - 1] + d[i]; } for (int i = 1; i < n + 1; i++) { cout << arr[i] + sum[i] << " "; } return 0; }
二维差分:
#include<iostream> using namespace std; const int N = 1010; int m, n; int q; int arr[N][N], d[N][N], sum[N][N]; int main() { cin >> n >> m >> q; for (int i = 1; i < n + 1; i++) { for (int j = 1; j < m + 1; j++) { cin >> arr[i][j]; } } while (q--) { int x1, y1, x2, y2, c; cin >> x1 >> y1 >> x2 >> y2 >> c; d[x1][y1] += c; d[x1][y2 + 1] -= c; d[x2+1][y1] -= c; d[x2 + 1][y2 + 1] += c; } for (int i = 1; i < n + 1; i++) { for (int j = 1; j < m + 1; j++) { sum[i][j] = d[i][j] + sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1]; cout << sum[i][j] + arr[i][j] << " "; } cout << endl; } return 0; }
弄的有点匆忙 希望对读者有用 ^.^