题意:
在 n\times nn×n 的格子上有 mm 个地毯。
给出这些地毯的信息,问每个点被多少个地毯覆盖。
思路:
显然暴力解法是不可取的,所以我们使用二维差分,二维相较于一维仅是多个一维数组叠加,那么我们只需要将每一行都按照一维差分来做,从左往右扫描即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int a[1005][1005];
int main()
{
int n,m,i,j,x1,y1,x2,y2;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
for(j=x1;j<=x2;j++)
{
a[j][y1]++;//每一行地毯的头部+1
a[j][y2+1]--;//每一行地毯的尾部-1,终止扫描
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
a[i][j]+=a[i][j-1];//从左往右扫描
if(j==n) printf("%d",a[i][j]);
else printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}