题解:P12326 [蓝桥杯 2023 省 Java B] 矩形总面积

· · 题解

根据容斥原理, totalsq=sq_1+sq_2-overarea ,因此我们先算出两个矩形的面积,再算出重叠部分的长和宽,再特判它们是否都大于零(即是否存在),最后套用公式。

AC Code

#include <iostream>
#include <cmath>
#define maxn 1024
#define mod 1e9+7
#define rep(i,a,b) for(int i=a;i<b;i++)
#define upto(i,a,b) for(int i=a;i<=b;i++)
#define downto(i,a,b) for(int i=a;i>=b;i--)
#define itn int
#define fro for
const int N = 1e6 + 100;
typedef long long ll;
using namespace std;
int main() {
    ll x1, y1, x2, y2, x3, y3, x4, y4;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;

    ll chang1 = (ll)fabs(x1 - x2);//实际上题目没有保证输入顺序,防止负边
    ll kuan1 = (ll)fabs(y1 - y2);
    ll chang2 = (ll)fabs(x3 - x4);
    ll kuan2 = (ll)fabs(y3 - y4);

    ll sq1 = chang1 * kuan1;//两个矩形的面积
    ll sq2 = chang2 * kuan2;

    ll cdx1 = max(x1, x3);//重叠部分的坐标
    ll cdx2 = min(x2, x4);
    ll cdy1 = max(y1, y3);
    ll cdy2 = min(y2, y4);

    ll cdchang = cdx2 - cdx1;//重叠部分的长宽
    ll cdkuan = cdy2 - cdy1;

    ll chongdiesq = 0;

    if (cdchang>0 && cdkuan>0)/* 存在*/ {

        chongdiesq = cdchang * cdkuan;
    }

    ll anssq = sq1 + sq2 - chongdiesq;//容斥原理
    cout<<anssq;
    return 0;
}

完结撒花!