[编程题] 矩形重叠
时间限制:1秒
空间限制:32768K
平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。
输入描述:
输入包括五行。 第一行包括一个整数n(2 <= n <= 50), 表示矩形的个数。 第二行包括n个整数x1[i](-10^9 <= x1[i] <= 10^9),表示左下角的横坐标。 第三行包括n个整数y1[i](-10^9 <= y1[i] <= 10^9),表示左下角的纵坐标。 第四行包括n个整数x2[i](-10^9 <= x2[i] <= 10^9),表示右上角的横坐标。 第五行包括n个整数y2[i](-10^9 <= y2[i] <= 10^9),表示右上角的纵坐标。
输出描述:
输出一个正整数, 表示最多的地方有多少个矩形相互重叠,如果矩形都不互相重叠,输出1。
输入例子1:
2 0 90 0 90 100 200 100 200
输出例子1:
2
这个题目很像线段树求矩形覆盖面积,同样是离散化加扫描线,不知道的同学可以百度一下线段树求矩形并面积。
需要注意的是给line排序的时候当高度一致时优先把退出标志线排在前面(比如从下到上扫描,一个矩形的下边界为进入标志线,上边界为退出标志线),因为边界重叠不算。
//网易2019实习生招聘编程题集合 [编程题] 矩形重叠
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
int N;
int x1[55],Y1[55],x2[55],y2[55];
typedef struct node {
int left,right;
int cover;
}node;
node tree[100*4+5];
int xs[105];
int res=0;//结果
typedef struct line {
int xl,xr;
int y;
int sp;
bool operator < (const line &b) const {
if(y<b.y) return 1;
if(y==b.y&&sp==-1) return 1;
return 0;
}
}line;
vector<line> ls;
void build(int T,int l,int r) {
tree[T].left=l;
tree[T].right=r;
tree[T].cover=0;
if(l+1<r) {
build(T*2,l,(l+r)/2);
build(T*2+1,(l+r)/2,r);
}
}
void insert(int T,line l) {
if(l.xl>=xs[tree[T].right]||l.xr<=xs[tree[T].left])
return;
if(tree[T].left+1==tree[T].right&&xs[tree[T].left]>=l.xl&&xs[tree[T].right]<=l.xr) {
if(l.sp==1) {
tree[T].cover++;
}else {
tree[T].cover--;
}
res=max(res,tree[T].cover);
}else {
insert(T*2,l);
insert(T*2+1,l);
}
}
int main() {
while(cin>>N) {
res=0; ls.clear();
for(int i=1;i<=N;i++) scanf("%d",&x1[i]);
for(int i=1;i<=N;i++) scanf("%d",&Y1[i]);
for(int i=1;i<=N;i++) scanf("%d",&x2[i]);
for(int i=1;i<=N;i++) scanf("%d",&y2[i]);
int p=1;
for(int i=1;i<=N;i++) {
xs[p++]=x1[i];
xs[p++]=x2[i];
line l;
l.xl=x1[i],l.xr=x2[i],l.y=Y1[i],l.sp=1;
ls.push_back(l);
l.y=y2[i],l.sp=-1;
ls.push_back(l);
}
sort(&xs[1],&xs[p]);
sort(ls.begin(),ls.end());
build(1,1,p-1);
for(int i=0;i<ls.size();i++) {
//cout<<ls[i].xl<<" "<<ls[i].xr<<" "<<ls[i].y<<" "<<ls[i].sp<<endl;
insert(1,ls[i]);
}
cout<<res<<endl;
}
}