1 条题解

  • 0
    @ 2025-8-24 23:14:38

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Evan2000
    我要拿蓝√!!||支持壶关,忘关私

    搬运于2025-08-24 23:14:38,当前版本为作者最后更新于2025-04-24 20:59:24,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    给你两个矩阵的左下角和右上角坐标,让你求这两个矩阵的总面积,两个矩阵有可能重叠,重叠部分只算一次

    思路

    算出两个矩阵的面积的和,将其减去重叠部分的面积,然后就没了。注意:不开long long见祖宗!

    算出两个矩阵的面积应该很容易,只需要用其右上角列坐标减去其左下角列坐标,再乘上其右上角横坐标减去其左下角横坐标,就能求出面积了。

    算出重叠部分的面积稍微难一点,需要用第一个矩阵的右上角列坐标和第二个矩阵的右上角列坐标的最小值,减去第一个矩阵的左下角列坐标和第二个矩阵的左下角列坐标的最大值,算出重叠部分的高,然后再用第一个矩阵的右上角横坐标和第二个矩阵的右上角横坐标的最小值,减去第一个矩阵的左下角横坐标和第二个矩阵的左下角横坐标的最大值,算出重叠部分的宽,将高和宽相乘,就能算出重叠部分的面积了。

    如果算重叠部分时出现负数或 00,就说明没有重叠部分,需要特判一下,直接算两个矩阵的面积的和即可。

    AC 代码(C++)

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int x[5];
    int y[5];
    signed main()
    {
    	for(int i=1;i<=4;i++)
    	{
    		scanf("%lld%lld",&x[i],&y[i]);
    	}
      //读入
    	int ret=abs(x[2]-x[1])*abs(y[2]-y[1]);
    	int ans=abs(x[4]-x[3])*abs(y[4]-y[3]);
      //算出两个矩阵的面积
    	int a=min(x[2],x[4]);
    	int b=max(x[1],x[3]);
    	int c=min(y[2],y[4]);
    	int d=max(y[1],y[3]);
    	int sum=0;
    	if(a>b && c>d)//判一下有没有重叠部分,如果没有,sum保持不变,一直为0
    	{
    		sum=(a-b)*(c-d);
    	}
      //算出重叠部分的面积
    	printf("%lld",ret+ans-sum);
    	return 0;
    }
    
    • 1

    信息

    ID
    12165
    时间
    2000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者