Problem
在二维平面上,给定两个矩形,满足矩形的每条边分别和坐标轴平行,求这个两个矩形的并的面积。即它们重叠在一起之后的总的面积。
Solution
这方法真神奇。。。
Code
#include<cstdio>
#include<iostream>
#include<algorithm>
#include <iomanip>
#include<map>
#define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ll long long
const int MAXN=100020;
using namespace std;
struct Point{
int x,y;
};
Point p[10];
int iabs(int s){
return s>0?s:-s;
}
bool tog(Point p1,Point p2,Point p3,Point p4){
return (p1.x<=p3.x&&p1.y<=p3.y&&p2.x>=p4.x&&p2.y>=p4.y)||(p1.x>=p3.x&&p1.y>=p3.y&&p2.x<=p4.x&&p2.y<=p4.y);
}
int main(){
io_opt;
for(int i=1;i<=4;i++){
cin>>p[i].x>>p[i].y;
}
int s1=(p[2].x-p[1].x)*(p[2].y-p[1].y),s2=(p[4].x-p[3].x)*(p[4].y-p[3].y);
if(tog(p[1],p[2],p[3],p[4])){
cout<<max(s1,s2);
return 0;
}
ll s=s1;s+=s2;
int a1=max(p[1].x,p[1].y);
int b1=max(p[1].y,p[3].y);
int a2=min(p[2].x,p[4].x);
int b2=min(p[2].y,p[4].y);
if(a1<a2&&b1<b2){
cout<<s-(a2-a1)*(b2-b1)<<endl;
}
else{
cout<<s<<endl;
}
return 0;
}