CSUOJ-1986: 玄学

CSUOJ-1986: 玄学

Description

阴阳师子浩君,最近从《初等数论》,《线性代数》,《组合数学》三大玄学宝典中,取得了玄学的精髓,发现,当画出两个矩形组成的样子的图案时候,就很有可能出现SSR。 现在子浩君正研究《概率与统计》第四大宝典,所以,他需要统计这些图案的数据,子浩君有一项很重要的指标,就是该图形的面积,需要测量,但是,子浩君还需要研究宝典的精髓,所以这个任务就交给了作为一个ACMer的您,来帮他统计这项数据。

由于是要画符,如果最后组成的图案不能一笔画出,即两个矩形的边界一个公共点都没有的话,则输出不合法“Invalid!”。

Input

第一行为测试数据组数T(1<=T<=100)
第二行包括四个整数x1,y1,x2,y2,为第一个矩形某对角线两端端点的坐标。
第三行包括四个整数x3,y3,x4,y4,为第二个矩形某对角线两端端点的坐标。
矩形的每条边均和坐标轴平行。
输入保证其绝对值都在109范围以内,且保证输入的矩形不会退化为一个线段和一个点,即保证x1!=x2,y1!=y2,x3!=x4,y3!=y4。

Output

若两矩形相交,则输出矩形并的面积,若矩形的边界没有相交,则输出字符串“Invalid!”,不包括引号。

Sample Input

3

1 1 3 3
2 2 4 4

1 1 2 2
2 2 3 3

1 1 2 2
3 3 4 4

Sample Output

7
2
Invalid!

题解

首先千万注意:一个矩形在另一个矩形内部是不合法的!
因为他们没有交点。真的坑惨了,WA了不知道多少次。
剩下的就是细节问题了。不过多解释,直接上代码:

AC代码

#include<iostream>
using namespace std;
void swap(long long &a,long long &b)//交换两个数
{
	long long t=a;
	a=b;
	b=t;
}
long long f(long long a,long long b,long long c,long long d)//判断线段ab和cd是否有交集
{
	if(a<=c&&d<=b) return d-c;
	else if(c<=a&&b<=d) return b-a;
	else if(a<=c&&b>=c) return b-c;
	else if(a<=d&&b>=d) return d-a;
	return -1;
}
int main(){
	int t; scanf("%d",&t);
	while(t--){
		long long x1,y1,x2,y2,x3,y3,x4,y4;
		scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
		if(x1>x2) swap(x1,x2);
		if(y1>y2) swap(y1,y2);
		if(x3>x4) swap(x3,x4);
		if(y3>y4) swap(y3,y4);
		long long p=f(x1,x2,x3,x4),q=f(y1,y2,y3,y4);
		if(p==-1||q==-1) printf("Invalid!");
		else if((x1>x3&&x2<x4&&y1>y3&&y2<y4)||(x1<x3&&x2>x4&&y1<y3&&y2>y4)) printf("Invalid!");//如果一个矩形在另外一个矩形的内部
		else printf("%lld",(x2-x1)*(y2-y1)+(x4-x3)*(y4-y3)-p*q);
		printf("\n");
	}
}
/**********************************************************************
	Problem: 1986
	User: 1078427121
	Language: C++
	Result: AC
	Time:0 ms
	Memory:2024 kb
**********************************************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值