前缀和
- 可以减少处理时间
//使用sum数组记录和。
sum[i] = sum[i-1] + a[i];
//a~b之间所有数的和。
cout << sum[b] - sum[a - 1];
二维前缀和
//使用sum数组记录和。
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
//a1,b1~a2,b2之间所有数的和。
cout << sum[a2][b2] - sum[a1 - 1][b2] - sum[a2][b1 - 1] + sum[a1 - 1][b1 - 1];
一维差分
//求出a的差分数组
for(int i = 1; i <= n; i++)
a[i] -= a[i - 1];
a[l] += 5;
a[r + 1] -= 5;
//再求前缀和
for(int i = 1; i <= n; i++)
a[i] += a[i - 1];
二维差分
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
}
sum[x1][y1]+=5;
sum[x2+1][y1]-=5;
sum[x1][y2+1]+=5;
sum[x2+1][y2+1]-=5;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
}
双指针
for(int i=1,j=1;i<=n;i++){
while(sum<s&&j<=n){
sum+=a[j];
j++;
}
if(sum>=s) mmin=min(mmin,j-i);
sum-=a[i];
}