专栏文章

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

P12326题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipiaec5
此快照首次捕获于
2025/12/03 12:27
3 个月前
此快照最后确认于
2025/12/03 12:27
3 个月前
查看原文
根据容斥原理,totalsq=sq1+sq2overareatotalsq=sq_1+sq_2-overarea,因此我们先算出两个矩形的面积,再算出重叠部分的长和宽,再特判它们是否都大于零(即是否存在),最后套用公式。

AC Code


CPP
#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;
}

完结撒花!

评论

0 条评论,欢迎与作者交流。

正在加载评论...