C题 - 覆叶之交

题意:

分别给出三个矩形的左下角和右上角坐标,求三个举行的重叠面积。

思路

在集合论(Set Theory)中,有公式:A∪B∪C = A + B + C - A∩B - A∩C - B∩C + A∩B∩C 在本题中适用。

具体解题步骤为:

  1. 计算三个矩形各自的面积
  2. 计算三个矩形两两之间重叠的面积
  3. 计算三个矩形的重叠面积
  4. 根据公式得出结果

细节处理在代码注释部分标出

具体实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long

// 计算面积函数 - 输入两顶点坐标,返回面积
ll area(vector<int>& point1, vector<int>& point2){  
    if(point1[0]>=point2[0] || point1[1]>=point2[1]){	// 两“顶点”间无有效面积
        return 0LL; // long long类型的0
    }
    ll longth = point2[0]-point1[0];
    ll width = point2[1]-point1[1];
    return longth*width;
}

// 计算两矩形重叠面积 - 输入两组矩形顶点,返回面积
ll double_area(vector<vector<int>>& a, vector<vector<int>>& b){ 
    vector<int> point1(2), point2(2);	// "重叠部分"的左下角和右上角顶点
    point1[0] = max(a[0][0], b[0][0]);
    point1[1] = max(a[0][1], b[0][1]);
    point2[0] = min(a[1][0], b[1][0]);
    point2[1] = min(a[1][1], b[1][1]);
    return area(point1, point2);
}

// 计算三矩形重叠面积 - 输入三组矩形顶点,返回面积
ll triple_area(vector<vector<int>>& a, vector<vector<int>>& b, vector<vector<int>>& c){ 
    vector<int> point1(2), point2(2);
    point1[0] = max(max(a[0][0], b[0][0]), c[0][0]);
    point1[1] = max(max(a[0][1], b[0][1]), c[0][1]);
    point2[0] = min(min(a[1][0], b[1][0]), c[1][0]);
    point2[1] = min(min(a[1][1], b[1][1]), c[1][1]);
    return area(point1, point2);
}

// 解题函数
void solve(){
    vector<vector<vector<int>>> vertices(3, vector<vector<int>> (2, vector<int>(2)));	// 定义三维向量存储矩形信息 分别对应 【矩阵】【顶点】【横/纵坐标】 
    for(int i=0; i<3; i++){
        for(int j=0; j<2; j++){
            cin>>vertices[i][j][0]>>vertices[i][j][1];	// 输入矩阵顶点坐标信息
        }
    }
    ll ans=0;
    ans += area(vertices[0][0], vertices[0][1]) + area(vertices[1][0], vertices[1][1]) + area(vertices[2][0], vertices[2][1]);
    ans -= double_area(vertices[0], vertices[1]) + double_area(vertices[2], vertices[1]) + double_area(vertices[0], vertices[2]);
    ans += triple_area(vertices[0], vertices[1], vertices[2]);
    cout<<ans;
    return;
}

int main() {
	ios::sync_with_stdio(false);	// 禁止cin与scanf混用,加快cin/cout效率
    cin.tie(nullptr);	// 取消cin和cout之间的关联
    
	solve();
	return 0;
}