D.矩形大饼(新生赛)

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;
}
发布了9 篇原创文章 · 获赞 12 · 访问量 142

猜你喜欢

转载自blog.csdn.net/qq_45949914/article/details/103807365