一维前缀和,一维差分,二维前缀和,二维差分模板

一维前缀和:

题目:

题目描述

给定一个长度为n的数组a1,a2,....ana_1, a_2,....a_na1​,a2​,....an​.

接下来有q次查询, 每次查询有两个参数l, r.

对于每个询问, 请输出al+al+1+....+ara_l+a_{l+1}+....+a_ral​+al+1​+....+ar​

输入描述:

第一行包含两个整数n和q.

第二行包含n个整数, 表示a1,a2,....ana_1, a_2,....a_na1​,a2​,....an​.

接下来q行,每行包含两个整数   l和r.

1≤n,q≤1051 \le n, q \le 10^51≤n,q≤105
−109≤a[i]≤109-10^9 \le a[i] \le 10^9−109≤a[i]≤109
1≤l≤r≤n1 \le l \le r \le n1≤l≤r≤n

输出描述:

输出q行,每行代表一次查询的结果.

示例1

输入

复制

3 2
1 2 4
1 2
2 3

输出

复制

3
6

代码:

#include
using namespace std;
long long qzh[100010];
int main(){
    int n,q,x;
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>x;
        qzh[i]=qzh[i-1]+x;
    }
    while(q--){
        int l,r;
        cin>>l>>r;
        cout<     }
}

一维差分:

题目:

题目描述

给你一个长度为n的正数数组a1,a2,...ana_1,a_2,...a_na1​,a2​,...an​.

接下来对这个数组进行m次操作,每个操作包含三个参数l,r,k,代表将数组中al,...ara_l,...a_ral​,...ar​部分都加上k。

请输出操作后的数组。

输入描述:

第一行包含两个整数n和m。
第二行包含n个整数表示a1,...ana_1,...a_na1​,...an​
接下来是m行,每行三个整数,分别代表每次操作的参数l,r,k.

1≤n,m≤1051 \le n , m \le 10^51≤n,m≤105
−109≤a[i]≤109-10^9 \le a[i] \le 10^9−109≤a[i]≤109
1≤l≤r≤n1 \le l \le r \le n1≤l≤r≤n
−109≤k≤109-10^9 \le k \le 10^9−109≤k≤109

输出描述:

输出1行,表示m次操作后的a1,...ana_1,...a_na1​,...an​

示例1

输入

3 2
1 2 3
1 2 4
3 3 -2

输出

5 6 

代码:

#include
using namespace std;
int a[100010];
long long cf[100010];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        cf[i]=a[i]-a[i-1];
    }
    int l,r,k;
    while(m--){
        cin>>l>>r>>k;
        cf[l]+=k;
        cf[r+1]-=k;
    }
    long long ans=0;
    for(int i=1;i<=n;i++){
        ans+=cf[i];
        cout<         if(i!=n) cout<<' '; 
    }
}

二维前缀和:

题目:
 

题目描述

给你一个 n 行 m 列的矩阵 A ,下标从1开始。

接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2

请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和,

输入描述:

第一行包含三个整数n,m,q.

接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数

1≤n,m≤10001 \le n, m \le 10001≤n,m≤1000
1≤q≤1051 \le q \le 10^51≤q≤105
−109≤a[i][j]≤109-10^9 \le a[i][j] \le 10^9−109≤a[i][j]≤109
1≤x1≤x2≤n1 \le x_1 \le x_2 \le n1≤x1​≤x2​≤n
1≤y1≤y2≤m1 \le y_1 \le y_2 \le m1≤y1​≤y2​≤m

输出描述:

输出q行,每行表示查询结果。

示例1

输入

3 4 3
1 2 3 4
3 2 1 0
1 5 7 8
1 1 2 2
1 1 3 3
1 2 3 4

输出

8
25
32

代码:

#include
using namespace std;
int a[1010][1010];
long long qzh[1010][1010];
int main(){
    int n,m,q;
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            qzh[i][j]=a[i][j]+qzh[i-1][j]+qzh[i][j-1]-qzh[i-1][j-1];
        }
    }
    while(q--){
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        cout<     }
}

二维差分:

题目 :
 

题目描述

给你一个n行m列的矩阵,下标从1开始。
接下来有q次操作,每次操作输入5个参数x1, y1, x2, y2, k
表示把以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k,
请输出操作后的矩阵。

 

输入描述:

第一行包含三个整数n,m,q.
接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行5个整数x1, y1, x2, y2, k,分别代表这次操作的参数

1≤n,m≤10001\le n,m \le 10001≤n,m≤1000
1≤q≤1051\le q \le 10^51≤q≤105
1≤x1≤x2≤n1\le x1 \le x2 \le n1≤x1≤x2≤n
1≤y1≤y2≤m1\le y1 \le y2 \le m1≤y1≤y2≤m
−109≤矩阵中的元素≤109-10^9 \le 矩阵中的元素 \le 10^9−109≤矩阵中的元素≤109

输出描述:

输出n行,每行m个数,每个数用空格分开,表示这个矩阵。

示例1

输入

2 3 4
1 2 3
4 5 6
1 1 2 2 3
1 2 2 3 -1
1 1 1 3 4
1 1 2 1 1

输出

9 8 6
8 7 5

代码:

#include
using namespace std;
int a[1010][1010];
long long cf[1010][1010];
int main(){
    int n,m,q;
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    while(q--){//构造差分数组
        int x1,y1,x2,y2,k;
        cin>>x1>>y1>>x2>>y2>>k;
        cf[x1][y1]+=k;
        cf[x1][y2+1]-=k;
        cf[x2+1][y1]-=k;
        cf[x2+1][y2+1]+=k;
    }
    for(int i=1;i<=n;i++){//差分——前缀和(不明白)
        for(int j=1;j<=m;j++){
            cf[i][j]=cf[i][j]+cf[i][j-1]+cf[i-1][j]-cf[i-1][j-1];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<             if(j!=m) cout<<' ';
            else cout<         }
    }
}

你可能感兴趣的:(算法)