这个比较简单,就是类似高中学的数列,记住公式
差分
一维差分
#include<iostream>
using namespace std;
const int N=100010;
int n,m;
int c[N],a[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i],c[i]=a[i]-a[i-1];
while(m--)
{
int l,r,x;
cin>>l>>r>>x;
c[l]+=x;
c[r+1]-=x;
}
for(int i=1;i<=n;i++)a[i]=a[i-1]+c[i],printf("%d ",a[i]);
return 0;
}
二位差分
#include<iostream>
using namespace std;
const int N=1010;
int s[N][N],c[N][N];
int n,m,q;
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>s[i][j],c[i][j]=s[i][j]-s[i-1][j]-s[i][j-1]+s[i-1][j-1];
while(q--)
{
int x1,x2,y1,y2,x;
cin>>x1>>y1>>x2>>y2>>x;
c[x1][y1] +=x;
c[x1][y2+1] -=x;
c[x2+1][y1] -=x;
c[x2+1][y2+1] +=x;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
s[i][j]=c[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1],printf("%d ",s[i][j]);
printf("\n");
}
return 0;
}
前缀和
一维前缀和
#include<iostream>
using namespace std;
const int N=100010;
int n,m;
int a[N],s[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i],s[i]=s[i-1]+a[i];
while(m--)
{
int l,r;
cin>>l>>r;
printf("%d\n",s[r]-s[l-1]);
}
return 0;
}
二维前缀和
#include<iostream>
using namespace std;
const int N=1010;
int n,m,q;
int a[N][N],s[N][N];
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j],s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
while(q--)
{
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
int ans=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
cout<<ans<<endl;
}
return 0;
}