差分,可以视作前缀和的逆运算。
前缀和用于去求一个区间段的和
差分用于改变一个区间的值(比如说某个区间都加上或者减去一个数)
P2367 语文成绩
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,p;
int a[5000005];
int dif[5000005];
int x,y,z;
int minn=0x3f3f3f3f;signed main()
{cin>>n>>p;for(int i=1;i<=n;i++){cin>>a[i];dif[i]=a[i]-a[i-1];}for(int i=1;i<=p;i++){cin>>x>>y>>z;dif[x]+=z;dif[y+1]-=z;}for(int i=1;i<=n;i++){a[i]=a[i-1]+dif[i];minn=min(a[i],minn);}cout<<minn;return 0;
}
P3397 地毯
#include<bits/stdc++.h>
using namespace std;
int n,m;
int dif[1005][1005];
int a,b,c,d;
signed main()
{cin>>n>>m;for(int i=1;i<=m;i++){cin>>a>>b>>c>>d;dif[a][b]+=1;dif[c+1][b]-=1;dif[a][d+1]-=1;dif[c+1][d+1]+=1;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dif[i][j] += dif[i - 1][j] + dif[i][j - 1] - dif[i - 1][j - 1]; }}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cout<<dif[i][j]<<" ";}cout<<endl;}return 0;
}