信奥考前梳理6·前缀和和差分

一维前缀和模板

for (int i = 1; i <= n; i++) {
    cin >> a[i];
    sum[i] = sum[i - 1] + a[i];   //sum[i]表示a[1]~a[i]的累加和
}

sum[r] - sum[l - 1]	//应用:求l到r区间范围的a[i]的累加和

一维差分模板

/*
     * 应用:
     * 在l~r范围的a[i]加上数值x,
     * 只需要修改差分数组的值,再对差分数组做前缀和就是原来的数组
    */

//对应每次修改只有p[l]、p[r+1]发生改变
while (m--) {
    cin >> l >> r >> x; //m次修改,每次修改都是在l~r范围内的a[i]加上数值x
    p[l] += x;          //差分数组在每次修改只有p[l]、p[r+1]发生改变
    p[r + 1] -= x;
}

for(int i=1; i<=n; i++) 
    p[i] += p[i-1];     //此时p[i]就是修改累计下来的结果,p[i]+a[i]就是修改之后最后的值

二维前缀和

for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
        cin >> a[i][j];
        //s[i][j]表示以(1,1)作为左上角,(i,j)作为右下角构成的子矩阵内所有a[][]的累加和
        s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + a[i][j];
    }


/*
     * 应用:现在知道左上角的坐标未(i,j),右下角的坐标为(p,q),求构成的子矩阵的a[][]的累加和
     *
     */
ans = s[p][q] - s[i - 1][q] - s[p][j - 1] + s[i - 1][j - 1]
posted @ 2024-07-17 18:59  Jared-Aya  阅读(22)  评论(0)    收藏  举报