此题约为NOIP提高组Day2T1难度。
题目描述
在 n×n 的格子上有 m 个地毯。
给出这些地毯的信息,问每个点被多少个地毯覆盖。
输入格式
第一行,两个正整数 n,m。意义如题所述。
接下来 m 行,每行两个坐标 (x_1,y_1)(x1,y1) 和 (x_2,y_2)(x2,y2),代表一块地毯,左上角是 (x_1,y_1)(x1,y1),右下角是 (x_2,y_2)(x2,y2)。
输出格式
输出 n行,每行 n 个正整数。
第 i 行第 j列的正整数表示 (i,j)(i,j) 这个格子被多少个地毯覆盖。
输入输出样例
输入 #1复制
5 3 2 2 3 3 3 3 5 5 1 2 1 4
输出 #1复制
0 1 1 1 0 0 1 1 0 0 0 1 2 1 1 0 0 1 1 1 0 0 1 1 1
说明/提示
样例解释
覆盖第一个地毯后:
00 | 00 | 00 | 00 | 00 |
---|---|---|---|---|
00 | 11 | 11 | 00 | 00 |
00 | 11 | 11 | 00 | 00 |
00 | 00 | 00 | 00 | 00 |
00 | 00 | 00 | 00 | 00 |
覆盖第一、二个地毯后:
00 | 00 | 00 | 00 | 00 |
---|---|---|---|---|
00 | 11 | 11 | 00 | 00 |
00 | 11 | 22 | 11 | 11 |
00 | 00 | 11 | 11 | 11 |
00 | 00 | 11 | 11 | 11 |
覆盖所有地毯后:
00 | 11 | 11 | 11 | 00 |
---|---|---|---|---|
00 | 11 | 11 | 00 | 00 |
00 | 11 | 22 | 11 | 11 |
00 | 00 | 11 | 11 | 11 |
00 | 00 | 11 | 11 | 11 |
数据范围
对于 20\%20% 的数据,有 n\le 50n≤50,m\le 100m≤100。
对于 100\%100% 的数据,有 n,m\le 1000n,m≤1000。
我们先来分析题意,主要含义就是让我们将每次被他所提供坐标包围的这一片区域加上1.
给与我们两个坐标,在二维空间中,将这一片区域加上指定值,是典型的差分思想。于是我们可以利用差分来完成此题。
我们在此之前都学习过有关于差分的构造,但在此题目中,初始值都为0,因此我们可以想到这题不是利用典型的构造差分数组来完成,而是利用差分思想来完成我们的目的。
首先,我们要在这一片区域中所有的值加上一,可以利用一维差分的思想让每一行都完成这样的操作。
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
int a[2050][2050];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
while(m--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(int i=x1;i<=x2;i++)
{
a[i][y1]++;
a[i][y2+1]--;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
a[i][j]+=a[i][j-1];
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}