• CSU-1986 玄学


    题目链接

    http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=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惨了

    然后就是如何计算矩形相交面积的基础问题了,我们先假设两个矩形相交,那么相交矩形的左下角坐标是这样的;

    横坐标:两个矩形左下角横坐标的较大值

    纵坐标:两个矩形左下角纵坐标的较大值

    相交矩形右上角坐标:

    横坐标:两个矩形右上角横坐标的较小值

    纵坐标:两个矩形右上角纵坐标的较小值

    然后此时如果右上角坐标比左下角小,则不相交,然后特判一个矩形在另一个矩形内部的情况,均输出invalid,其他情况下,用左下角和右上角坐标计算出面积,输出面积即可

    AC代码

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    int main() {
    	int T;
    	scanf("%d", &T);
    	while (T--) {
    		ll x1, y11, x2, y22, x3, y33, x4, y44;
    		scanf("%lld%lld%lld%lld", &x1, &y11, &x2, &y22);
    		scanf("%lld%lld%lld%lld", &x3, &y33, &x4, &y44);
    		ll minx1 = min(x1, x2), miny1 = min(y11, y22);
    		ll maxx1 = max(x1, x2), maxy1 = max(y11, y22);
    		ll minx2 = min(x3, x4), miny2 = min(y33, y44);
    		ll maxx2 = max(x3, x4), maxy2 = max(y33, y44);
    		ll minx = max(minx1, minx2), miny = max(miny1, miny2);
    		ll maxx = min(maxx1, maxx2), maxy = min(maxy1, maxy2);
    		if (minx > maxx || miny > maxy || (minx > minx1 && miny > miny1 && maxx < maxx1 && maxy < maxy1) || (minx > minx2 && miny > miny2 && maxx < maxx2 && maxy < maxy2)) {
    			printf("Invalid!
    ");
    			continue;
    		}
    		else {
    			ll ans = (maxx1 - minx1) * (maxy1 - miny1) - (maxx - minx) * (maxy - miny) + (maxx2 - minx2) * (maxy2 - miny2);
    			printf("%lld
    ", ans);
    		}
    	}
    	return 0;
    }
    /**********************************************************************
    	Problem: 1986
    	User: Artoriax
    	Language: C++
    	Result: AC
    	Time:0 ms
    	Memory:2024 kb
    **********************************************************************/
    
    
  • 相关阅读:
    [转]Oracle创建删除用户、角色、表空间、导入导出数据库命令行方式总结
    [转]23种设计模式与泡MM的关系
    [转]23种设计模式之间的关系
    [转]如何提高服务器的访问速度
    SVN所在的服务器IP改变了,肿么办
    HTML中ID与NAME的区别
    Java与.net异构平台上web service间复杂对象的互操作
    下一代OS系统展望之我见(针对windows,其他OS我不熟)
    使用axis开发java web service
    关于Java与DotNet异构平台WebService中enum对象的交互
  • 原文地址:https://www.cnblogs.com/artoriax/p/10370861.html
Copyright © 2020-2023  润新知