#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int v[1001][1001];
int s[1001][1001];
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)//前缀和
{
int lx,ly,rx,ry;
cin>>lx>>ly>>rx>>ry;
v[lx-1][ly-1]+=1;
v[rx][ly-1]-=1;
v[lx-1][ry]-=1;
v[rx][ry]+=1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(!i&&!j) s[i][j]=v[i][j];
else if(!i) s[i][j]=s[i][j-1]+v[i][j];
else if(!j) s[i][j]=s[i-1][j]+v[i][j];
else s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+v[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<s[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
上面是二维前缀和
下面是一维前缀和
#include<iostream>
#include<algorithm>
using namespace std;//一维差分算法
int n,m;
int v[1000][1000];
int ans[1000][1000];
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int lx,ly,rx,ry;
cin>>lx>>ly>>rx>>ry;
for(int j=ly-1;j<ry;j++)
{
v[lx-1][j]+=1;
v[rx][j]-=1;
}
}
for(int i=0;i<n;i++)
{
int tem=0;
for(int j=0;j<n;j++)
{
tem+=v[j][i];
ans[j][i]=tem;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}