2025-01-23差分

差分

情景

将区间[l,r]之间每个元素都加上一个数c,求修改后数组的值。

主要内容

一维差分

image-20250123190723456

二维差分

image-20250124103958573

模板题

一维差分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<bits/stdc++.h>
using namespace std;

int n,q;
const int N=1e5+5;
int a[N];
int diff[N];

void insert(int l,int r,int x){
diff[l]+=x;
diff[r+1]-=x;
}

void work(){
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];

for(int i=1;i<=n;i++) insert(i,i,a[i]);//初始化,把a[i]加到第i个位置上

while(q--){
int l,r,c;
cin>>l>>r>>c;

insert(l,r,c);
}

int pre=0;
for(int i=1;i<=n;i++){
pre=diff[i]+pre;
cout<<pre<<endl;
}
}

int main(){
work();
return 0;
}

二维差分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<bits/stdc++.h>
using namespace std;

int n,m,q;
const int N=1005;
int diff[N][N],sum[N][N];

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


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

while(q--){
int x1,y1,x2,y2,c;
cin>>x1>>y1>>x2>>y2>>c;

insert(x1,y1,x2,y2,c);

}

for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum[i][j]=diff[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
cout<<sum[i][j]<<" ";
}
cout<<endl;
}
}

int main(){
work();
return 0;
}

2025-01-23差分
http://666xz666.github.io/2025/01/23/差分/
作者
666xz666
发布于
2025年1月23日
许可协议