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
**********************************************************************/