1.用二维差分数组的递推公式求前缀和
#include<stdio.h>
int a[1010][1010],D[1010][1010]; //D[][]是差分数组
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
while(m--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
D[x1][y1]+=1; D[x2+1][y1]-=1; //一维差分中 D[i]=a[i]-a[i-1]
D[x1][y2+1]-=1; D[x2+1][y2+1]+=1; //二维差分中 D[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]
} //计算差分数组
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
a[i][j]=D[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1];
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
2.直接计算前缀和(把第一种方法代码的14-22行替换掉)
#include<stdio.h>
int a[1010][1010],D[1010][1010]; //D[][]是差分数组
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
while(m--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
D[x1][y1]+=1; D[x2+1][y1]-=1; //一维差分中 D[i]=a[i]-a[i-1]
D[x1][y2+1]-=1; D[x2+1][y2+1]+=1; //二维差分中 D[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]
} //计算差分数组
for(i=1;i<=n;i++)
for(j=1;j<n;j++) //注意这里j<n
D[i][j+1]+=D[i][j]; //把i看作定值,先累加计算j方向
for(j=1;j<=n;j++)
for(i=1;i<n;i++) // i<n
D[i+1][j]+=D[i][j]; //同理
for(i=1;i<=n;i++) //打印
{
for(j=1;j<=n;j++)
printf("%d ",D[i][j]);
printf("\n");
}
return 0;
}