基础算法--差分,二维差分

差分面向的问题是对于一段数组同时加上某个值的问题

差分是前缀和的逆操作

差分没有必要关注差分的构造,因为你写好了插入函数的话,对[i,i]区间插入a[i]就好了

 1 #include<iostream>
 2 using namespace std;
 3 int n,m;
 4 const int N=1e5+10;
 5 int a[N],b[N];
 6 void insert(int l,int r,int c){
 7     b[l]+=c;
 8     b[r+1]-=c;
 9 }
10 int main(void){
11     cin>>n>>m;
12     for(int i=1;i<=n;i++){
13         cin>>a[i];
14     }
15     for(int i=1;i<=n;i++){
16         insert(i,i,a[i]);
17     }
18     while(m--){
19         int l,r,c;
20         cin>>l>>r>>c;
21         insert(l,r,c);
22     }
23     for(int i=1;i<=n;i++){
24         b[i]=b[i]+b[i-1];
25         cout<<b[i]<<" ";
26     }
27     return 0;
28 }

 

 

#include<iostream>
using namespace std;
int n,m,q;
const int N=1010;
int a[N][N],b[N][N];
void insert(int x1,int y1,int x2,int y2,int c){
    b[x1][y1]+=c;
    b[x2+1][y1]-=c;
    b[x1][y2+1]-=c;
    b[x2+1][y2+1]+=c;
}
int main(void){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            insert(i,j,i,j,a[i][j]);
        }
    }
    while(q--){
        int x1,y1,x2,y2,c;
        cin>>x1>>y1>>x2>>y2>>c;
        insert(x1,y1,x2,y2,c);
    }
    //从1,1做前缀和到i,j就是a[i][j]的值
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            b[i][j]=b[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
            cout<<b[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

 

posted on 2020-10-12 14:21  greenofyu  阅读(232)  评论(0)    收藏  举报