算法学习03:前缀和与差分(互逆)
前言
要记忆的模版:
//一维前缀和:
for(int i = 1; i <=n; i++) s[i] = s[i - 1] + a[i];
while(m--)
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d", s[r] - s[l - 1]);
}
//二维前缀和:
//前缀和初始化
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
s[i][j] = a[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
while(q--)
{
//计算区间和
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
printf("%d", s[x2][y2] - s[x1][y2] - s[x2][y1] + s[x1][y1]);
}
//一维差分
void insert(int l, int r, int c)
{
b[l] += c;
b[r + 1] -= c;
}
for(int i = 1; i <= n; i++) b[i] += b[i - 1];//从差分数组还原为结果
//二维差分
void insert(int x1, int y1, int x2, int y2, int c)
{
b[x1][y1] += c;
b[x1][y2] -= c;
b[x2][y1] -= c;
b[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];
提示:以下是本篇文章正文内容:
一、前缀和
1.一维
2.二维
二、差分
1.一维
2.二维
总结
提示:这里对文章进行总结:
💕💕💕