C++
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct Line{
int p, s, e, id;
};
Line line[2][100010];
int N, i_2;
long long parent[50010],rank_[50010],size_[500010],result=-1;
int find_(int a){
if(a==parent[a])
return a;
return parent[a]=find_(parent[a]);
}
int comp(Line c,Line d){
if(c.p==d.p){
if(c.s==d.s){
return c.e<d.e;
}
return c.s<d.s;
}
return c.p<d.p;
}
//comp-line connect-sort
void union_(int a,int b){
a=find_(a);
b=find_(b);
if(a==b)
return;
if(rank_[a]<rank_[b]){
parent[a]=b;
size_[b]+=size_[a];
size_[a]=0;
result=max(result, size_[b]);
}else{
parent[b]=a;
size_[a]+=size_[b];
size_[b]=0;
result=max(result, size_[a]);
if(rank_[a]==rank_[b]){
rank_[a]++;
}
}
}
int main()
{
for(int i=0;i<=50005;i++){
parent[i]=i;
}
scanf("%d",&N);
for(int i=0;i<N;i++){
int x,y,w,h;
scanf("%d %d %d %d",&x,&y,&w,&h);
line[0][i]={x,y,y+h,i};
line[1][i]={y,x,x+w,i};
line[0][i+N]={x+w,y,y+h,i};
line[1][i+N]={y+h,x,x+w,i};
size_[i]=h*w;
result=max(result,(long long)h*w);
}
sort(line[0],line[0]+N+N,comp);
sort(line[1],line[1]+N+N,comp);
for(int j=0;j<=1;j++){
for(int i=1;i<N+N;i++){
int k,u=line[j][i-1].e;
for(k=i;line[j][k-1].p==line[j][k].p;k++){
if(u>=line[j][k].s){
u=max(u,line[j][k].e);
union_(line[j][k-1].id,line[j][k].id);
}else{
break;
}
}
i=k;
}
}
printf("%d",result);
return 0;
}
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | 안내사항 | 관리자 | 2019.12.21 | 164 |
15 | 14430 | 관리자 | 2019.12.21 | 6 |
14 | 1182 | 관리자 | 2019.12.21 | 8 |
13 | 11660 | 관리자 | 2020.04.11 | 46 |
12 | 1149 | 관리자 | 2019.12.21 | 8 |
11 | 10999 | 관리자 | 2020.04.11 | 47 |
10 | 10937 | 관리자 | 2020.04.11 | 41 |
9 | 10919 | 관리자 | 2020.04.11 | 42 |
8 | 10800 | 관리자 | 2019.12.21 | 8 |
7 | 10799 | 관리자 | 2019.12.21 | 9 |
» | 10534 | 관리자 | 2020.04.11 | 44 |
5 | 10164 | 관리자 | 2019.12.21 | 6 |
4 | 10159 | 관리자 | 2019.12.21 | 6 |
3 | 10157 | 관리자 | 2019.12.21 | 8 |
2 | 10070 | 관리자 | 2020.04.11 | 44 |
1 | 1005 | 관리자 | 2019.12.21 | 8 |