Problem
在二维平面上,给定两个矩形,满足矩形的每条边分别和坐标轴平行,求这个两个矩形的并的面积。即它们重叠在一起之后的总的面积。
Solution
这方法真神奇。。。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #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; }
|