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

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

差分是前缀和的逆操作

差分没有必要关注差分的构造,因为你写好了插入函数的话,对[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   greenofyu  阅读(225)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示