矩形重叠
题目:
平面内有
n
个矩形, 第i
个矩形的左下角坐标为, 右上角坐标为。
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。输入描述:
输入包括五行。
第一行包括一个整数n
, 表示矩形的个数。
第二行包括n
个整数,表示左下角的横坐标。
第三行包括n
个整数,表示左下角的纵坐标。
第四行包括n
个整数,表示右上角的横坐标。
第五行包括n
个整数,表示右上角的纵坐标。输出描述:
输出一个正整数, 表示最多的地方有多少个矩形相互重叠,如果矩形都不互相重叠,输出1。
样例:
in: 2 0 90 0 90 100 200 100 200 out: 2
将n个矩形轮流作为被覆盖区域,每次被覆盖则更新区域,n次后求出最大值即可。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct node{ 5 int x1,y1,x2,y2; 6 bool operator < (const node&node1) const{ 7 if(x1!=node1.x1){ 8 return x1<node1.x1; 9 } 10 if(y1!=node1.y1){ 11 return y1<node1.y1; 12 } 13 if(x2!=node1.x2){ 14 return x2<node1.x2; 15 } 16 else{ 17 return y2<node1.y2; 18 } 19 } 20 }a[60]; 21 22 int main(){ 23 int n; 24 cin>>n; 25 for(int i=0;i<n;i++){ 26 cin>>a[i].x1; 27 } 28 for(int i=0;i<n;i++){ 29 cin>>a[i].y1; 30 } 31 for(int i=0;i<n;i++){ 32 cin>>a[i].x2; 33 } 34 for(int i=0;i<n;i++){ 35 cin>>a[i].y2; 36 } 37 sort(a,a+n); 38 int ans=0; 39 for(int i=0;i<n;i++){ 40 int cnt=0,x1=a[i].x1,y1=a[i].y1,x2=a[i].x2,y2=a[i].y2; 41 for(int j=0;j<n;j++){ 42 if(a[j].x1<x2&&a[j].y1<y2&&a[j].x2>x1&&a[j].y2>y1){ 43 x1=max(x1,a[j].x1); 44 y1=max(y1,a[j].y1); 45 x2=min(x2,a[j].x2); 46 y2=min(y2,a[j].y2); 47 cnt++; 48 } 49 } 50 ans=max(cnt,ans); 51 } 52 cout<<ans<<endl; 53 return 0; 54 }