问题描述
在坐标平面上有 N 个矩形纸张。
每个纸张所覆盖的矩形区域的边与 x 或 y 轴平行。
具体来说,第 i 个纸张覆盖了满足Ai≤x≤Bi 和 Ci≤y≤Di 的区域。
设 S 为一个或多个纸张所覆盖的区域的面积。在约束条件下,可以证明 S 是一个整数。
将 S 打印为整数。
约束条件
- 2≤N≤100
- 0≤Ai<Bi≤100
- 0≤Ci<Di≤100
- 所有输入值都是整数。
输入
输入以以下格式从标准输入给出:
N A1 B1 C1 D1 A2 B2 C2 D2 ⋮⋮ AN BN CN DN
输出
将一个或多个纸张所覆盖的区域的面积 S 打印为整数。
示例-1
输入
3
0 5 1 3
1 4 0 5
2 5 2 4
输出
20
这三个纸张覆盖了以下区域。
这里,红色、黄色和蓝色分别表示第一个、第二个和第三个纸张所覆盖的区域。
因此,一个或多个纸张所覆盖的区域的面积是S=20。
示例-2
输入
3
0 1 0 1
0 3 0 5
5 10 0 10
输出
65
C程序源代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=200+5;
struct Node//矩形
{
double x1,y1,x2,y2;
}nodes[maxn];
double x[maxn],y[maxn];
bool mp[maxn][maxn];
int find(double *x,double val,int n)//在数组x中找到val值的位置
{
int L=0,R=n-1;
while(R>=L)
{
int mid=L+(R-L)/2;
if(x[mid]==val) return mid;
else if(x[mid]>val) R=mid-1;
else L=mid+1;
}
return -1;
}
int main()
{
int n,num1,num2,kase=0;
while(scanf("%d",&n)==1 && n)
{
num1=num2=0;//num1记录有多少个不同x值,num2记录y的
memset(mp,0,sizeof(mp));
for(int i=0;i<n;++i)
{
scanf("%lf%lf%lf%lf",&nodes[i].x1,&nodes[i].x2,&nodes[i].y1,&nodes[i].y2);
x[num1++]=nodes[i].x1;
x[num1++]=nodes[i].x2;
y[num2++]=nodes[i].y1;
y[num2++]=nodes[i].y2;
}
sort(x,x+num1);
sort(y,y+num2);
num1=unique(x,x+num1)-x;//去重
num2=unique(y,y+num2)-y;//去重
for(int i=0;i<n;++i)
{
//找出第i个原始大矩形覆盖的小矩形范围
int L_x=find(x,nodes[i].x1,num1);
int R_x=find(x,nodes[i].x2,num1);
int L_y=find(y,nodes[i].y1,num2);
int R_y=find(y,nodes[i].y2,num2);
for(int j=L_x;j<R_x;++j)
for(int k=L_y;k<R_y;++k)
mp[j][k]=true;
}
double ans=0;
for(int i=0;i<num1;++i)
for(int j=0;j<num2;++j)if(mp[i][j])
ans += (x[i+1]-x[i])*(y[j+1]-y[j]);
int a=(int) ans;
printf("%d",a);
}
return 0;
}