差分数组+前缀和

119 阅读1分钟

一维前缀和

模板题目链接:795. 前缀和

参考代码:

m,n  = [int(x) for x in input().split(' ')]
nums = [int(x) for x in input().split(' ')]
pre = [0 for i in range(len(nums) + 1)]
for i in range(len(nums)):
    pre[i + 1] = nums[i] + pre[i]
for i in range(n):
    start, end = [int(x) for x in input().split(' ')]
    print(pre[end] - pre[start - 1])

二维前缀和

模板题目链接:796. 子矩阵的和

n, m, q = [int(x) for x in input().split(' ')]

matrix = []

for _ in range(n):
    matrix.append([int(x) for x in input().split(' ')])

pre = [[0 for _ in range(m + 1)] for _ in range(n + 1)]

for i in range(1, n + 1):
    for j in range(1, m + 1):
        pre[i][j] =  matrix[i - 1][j - 1] + pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1]

for _ in range(q):
    x1, y1, x2, y2 = [int(x) for x in input().split(' ')]
    print(pre[x2][y2] - pre[x2][y1 - 1] - pre[x1 - 1][y2] +  pre[x1 - 1][y1 - 1])

一维差分数组

模板题目链接:797. 差分

import java.util.*;

public class Main{

    public static void insert(int[] s, int l, int r, int v) {
        s[l] = s[l] + v;
        s[r + 1] = s[r + 1] - v;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] s = new int[n + 1];
        for(int i = 0; i < n; i ++) {
            int t = sc.nextInt();
            insert(s, i, i, t);
        }

        for(int i = 0; i < m; i++) {
            int l = sc.nextInt();
            int r = sc.nextInt();
            int v = sc.nextInt();
            insert(s, l - 1, r - 1, v);
        }

        for(int i = 1; i < n; i++) {
            s[i] += s[i - 1];
        }

        for(int i = 0; i < n; i++) {
            System.out.print(s[i] + ((i != n -1) ? " " : ""));
        }
        sc.close();
    }
}

二维差分数组

模板题目链接:AcWing 798. 差分矩阵

#include <iostream>

using namespace std;

const int N = 1010;

int matrix[N][N];

void insert(int x1, int y1, int x2, int y2, int t)
{
    matrix[x1][y1] += t;
    matrix[x2 + 1][y1] -= t;
    matrix[x1][y2 + 1] -= t;
    matrix[x2 + 1][y2 + 1] += t;
}


int main()
{
    int n,m,q;
    cin >> n >> m >> q;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            int t;
            cin >> t;
            insert(i, j, i, j, t);
        }
    }

    for(int i = 0; i < q; i++) 
    {
        int x1, x2, y1, y2, v;
        cin >> x1 >> y1 >> x2 >> y2 >> v;
        insert(x1, y1, x2, y2, v);
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            matrix[i][j] = matrix[i][j] + matrix[i - 1][j] + matrix[i][j - 1] - matrix[i - 1][j - 1];
            cout << matrix[i][j];
            if(j != m) cout << " ";
        }
        cout << endl;
    }
    return 0;
}