前缀和 和 差分

转载:
https://blog.csdn.net/carry_hkr/article/details/118389666#:~:text=%E6%A6%82%E5%BF%B5%26%E7%94%A8%E9%80%94%20%E5%89%8D%E7%BC%80%E5%92%8C%E6%98%AF%E8%87%AA%E8%BA%AB%E5%8A%A0%E4%B8%8A%E5%89%8D%E4%B8%80%E4%B8%AA%EF%BC%8C%E8%80%8C%20%E5%B7%AE%E5%88%86,%E5%B0%B1%E6%98%AF%20%E8%87%AA%E8%BA%AB%E5%87%8F%E5%8E%BB%E5%89%8D%E4%B8%80%E4%B8%AA%20%EF%BC%8C%E4%B8%8E%E5%89%8D%E7%BC%80%E5%92%8C%E7%B1%BB%E4%BC%BC%E4%BA%8E%E4%B8%80%E4%B8%AA%E2%80%9C%E9%80%86%E8%BF%90%E7%AE%97%E2%80%9D%EF%BC%8C%E6%88%91%E4%BB%AC%E7%BB%B4%E6%8A%A4%E7%9A%84%E6%98%AF%E4%B8%A4%E4%B8%AA%E7%9B%B8%E9%82%BB%E6%95%B0%E7%9A%84%E5%B7%AE

前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)。前缀和分为一维前缀和,以及二维前缀和。前缀和是一种重要的预处理,能够降低算法的时间复杂度。

前缀和:

一维前缀和的公式:sum[i] = sum[i-1] + arr[i] ; sum是前缀和数组, arr是内容数组。拥有前缀和数组后, 我们可以在O(1)的时间复杂度内求出区间和。
[i, j]的区间和公式: interval [i, j] = sum[j] - sum[i - 1]
对于二维数组,s[i][j]表示的是从左上角[1][1]到[i][j]矩阵的和,注意会有重复的,s[i][j]的取法不一样。

    对于给一个询问矩阵[x1,y1]到[x2][y2]之间的和,我们可以用

            \large s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]]

差分(转载里挺清楚地)

posted @ 2023-02-06 22:36  MITE's_BKY  阅读(821)  评论(0)    收藏  举报