C. C. Blog

Security Research, Algorithm and Data Structure

51Nod 2488 矩形并的面积

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;
}
  • 本文作者: CCWUCMCTS
  • 本文链接: https://ccwucmcts.github.io/posts/13933/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!