洛谷P3397 地毯
题目描述
在
n
×
n
n\times n
n×n 的格子上有
m
m
m 个地毯。
给出这些地毯的信息,问每个点被多少个地毯覆盖。
输入格式
第一行,两个正整数
n
,
m
n,m
n,m。意义如题所述。
接下来 m m m 行,每行两个坐标 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)和 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),代表一块地毯,左上角是 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),右下角是 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)。
输出格式
输出
n
n
n 行,每行
n
n
n 个正整数。
第 i i i 行第 j j j 列的正整数表示 ( 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
数据范围
对于
100
%
100\%
100%的数据,有
n
,
m
≤
1000
n,m\le 1000
n,m≤1000。
二维差分模版题。如果是一维差分,我们知道在每次操作的区间的两端标记一下就可以了。二维的时候不太知道怎么办。。其实就简单的把一维复制成二维就可以了。。
对于每个地毯,对 x 1 x_1 x1到 x 2 x_2 x2所有的行里进行一维类似的差分标记一下就可以了。最后计算结果的时候也是对每一行如一维般类似处理即可。
#include <bits/stdc++.h>
using namespace std;
int m,n;
int a[1024][1024];
int res[1024][1024];
int main(){
cin>>n>>m;
memset(a,0,sizeof(a));
memset(res,0,sizeof(res));
while(m--){
int x1,y1,x2,y2;
cin>>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++){
int now=0;
for(int j=1;j<=n;j++){
now+=a[i][j];
res[i][j]=now;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j>1) cout<<" ";
cout<<res[i][j];
}
cout<<endl;
}
return 0;
}