前缀和
前缀和
题目:https://www.acwing.com/activity/content/problem/content/829/1/
#include<iostream> using namespace std; const int maxn = 1e5; int n, m, l, r; int a[maxn], num[maxn]; int main() { cin >> n >> m; for(int i = 1; i <= n; i++) cin >> a[i]; for(int i = 1; i <= n; i++) a[i] = a[i] + a[i - 1]; while(m--) { cin >> l >> r; cout << a[r] - a[l - 1] << " " << endl; } return 0; }
子矩阵的前缀和
#include<iostream> using namespace std; const int maxn = 1000+10; int n, m, q, x1, y1, x2, y2; int s[maxn][maxn], a[maxn][maxn]; int main() { cin >> 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 ++) s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j]; while(q--) { cin >> x1 >> y1 >> x2 >> y2; cout << s[x2][y2] - s[x2][y1-1] - s[x1-1][y2] + s[x1-1][y1-1] << endl; } return 0; }