题意:桌面上放了N个矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。
输入:输入第一行为一个数N(1≤N≤100),表示矩形的数量。下面N行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标,坐标范围为–10^8到10^8之间的整数。
输出:输出只有一行,一个整数,表示图形的面积。
70pts代码如下:
#include<bits/stdc++.h>
#pragma once
using namespace std;
long long n,X1[110],X2[110],Y1[110],Y2[110],cnt;
long long lshx[220],lshy[220],lenx,leny;
long long ans;
bool mp[220][220];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
//if(a-c<0 && b-d>0) continue;
//else {
cnt++;
X1[cnt]=a,X2[cnt]=c;
Y1[cnt]=b,Y2[cnt]=d;
lshx[cnt]=X1[cnt],lshy[cnt]=Y1[cnt];
lshx[cnt+n]=X2[cnt],lshy[cnt+n]=Y2[cnt];
//}
}
sort(lshx+1,lshx+2*cnt+1);
sort(lshy+1,lshy+2*cnt+1);
lenx=unique(lshx+1,lshx+2*cnt+1)-lshx;
leny=unique(lshy+1,lshy+2*cnt+1)-lshy;
for(int i=1;i<=cnt;i++){
X1[i]=lower_bound(lshx+1,lshx+lenx+1,X1[i])-lshx;
X2[i]=lower_bound(lshx+1,lshx+lenx+1,X2[i])-lshx;
Y1[i]=lower_bound(lshy+1,lshy+leny+1,Y1[i])-lshy;
Y2[i]=lower_bound(lshy+1,lshy+leny+1,Y2[i])-lshy;
}
for(int i=1;i<=n;i++)
for(int j=X1[i];j<X2[i];j++)
for(int k=Y1[i];k<Y2[i];k++)
mp[j][k]=1;
for(int x=1;x<lenx;x++)
for(int y=1;y<leny;y++)
if(mp[x][y]) ans+=abs((lshx[x+1]-lshx[x])*(lshy[y+1]-lshy[y]));
printf("%lld",ans);
return 0;
}