网易2019实习生招聘编程题集合—矩形重叠(线段树)


[编程题] 矩形重叠

时间限制: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;
	}
}


猜你喜欢

转载自blog.csdn.net/ufo___/article/details/80237523
今日推荐