差分,可以视作前缀和的逆运算。
前缀和用于去求一个区间段的和
差分用于改变一个区间的值(比如说某个区间都加上或者减去一个数)
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;
}