前缀和思维导图:
一维前缀和算法模版:
#include <iostream>using namespace std;const int N = 100010;int n, m;
int s[N];int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++){int x;scanf("%d", &x);s[i] = s[i - 1] + x; // 前缀和的初始化}while (m--){int l, r;scanf("%d%d", &l, &r);printf("%d\n", s[r] - s[l - 1]); // 区间和的计算}return 0;
}
二维前缀和算法模版:
#include <iostream>using namespace std;const int N = 1010;int n, m, q, x;
int s[N][N];int main()
{scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){scanf("%d", &x);s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + x;}while (q--){int x1, y1, x2, y2;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);}return 0;
}