D.矩形大饼
== Description ==
某饼同学最近沉迷于吃矩形的大饼,某天中午他买了n张矩形的大饼,吃饱后发现还剩下两张,于是他将这两张矩形的大饼随便扔在了一张桌子上,这时,他突然发现这两张矩形大饼的每条边都分别与桌子的边平行。
由于吃饱了撑的没事干,某饼同学将桌子抽象成二维平面,将大饼抽象成二维平面上每条边与坐标轴平行的矩形,现在他想计算一下这两个矩形并的面积。
注意,如果两个矩形不相交,输出两个矩形的面积之和即可。Input
8个数,分别表示第一个矩形左下角坐标为(A,B),右上角坐标为(C,D);第二个矩形左下角坐标为(E,F),右上角坐标为(G,H)。保证A<C,B<D,E<G,F<H
保证所有数的绝对值不超过200,矩形并的面积≤160000。
Output
输出一个数表示矩阵并的面积。
Sample Input-3 0 3 4 0 -1 9 2
Sample Output
45
思路
实际上就是求矩形并的面积(原题为 51Nod-2488,本题数据做了削弱)。 满分通过的参赛选手,主要是以下三种方法:
①暴力判断。将所有矩形相交、包含、相离的情况(即 8 个数之间的大小关系)直接判断出 来,缺点是需要大量时间找出所有情况,时间复杂度为 O(1)
②由于绝对值不超过 200,因此我们将所有坐标都+200,这样不会影响矩形的面积大小,且 8 个数都变为正数。这时候就可以用二维数组将矩形包含的区域标记出来,然后再一个格子 一个格子的统计即可。虽然代码相对第一种来说比较简单,但是时间复杂度为 O(n*n),效率 较低
③标准解法。两个矩形的左下角坐标的最大值就是交矩形的左下角的点,两个矩形的右上角 坐标的最小值就是交矩形的右上角的点,因此直接判断两个矩形是否有交集即可。时间复杂 度为 O(1)
【源代码】
//第三种方法
#include<iostream>
using namespace std;
#define LL long long
struct Node
{
LL x;
LL y;
}A1,A2,B1,B2,C1,C2;
int main()
{
//输入
cin >> A1.x >> A1.y
>> A2.x >> A2.y
>> B1.x >> B1.y
>> B2.x >> B2.y;
//计算交集区域左下角和右上角的点
//两矩形左下角点的横纵坐标最大值,两右上角点横纵坐标的最小值
C1.x=max(min(A1.x,A2.x),min(B1.x,B2.x));
C1.y=max(min(A1.y,A2.y),min(B1.y,B2.y));
C2.x=min(max(A1.x,A2.x),max(B1.x,B2.x));
C2.y=min(max(A1.y,A2.y),max(B1.y,B2.y));
LL s1=(A2.x-A1.x)*(A2.y-A1.y);
LL s2=(B2.x-B1.x)*(B2.y-B1.y);
LL s3=(C2.x-C1.x)*(C2.y-C1.y);
if(C2.x>C1.x&&C2.y>C1.y) //判断是否有交集
printf("%d\n",s1+s2-s3);
else
printf("%d\n",s1+s2);
return 0;
}