其实我是想做hdu3060的。。。写完了发现。。。这题坑姐,还有凹的情况。。。无奈先找个OJ把俩凸的代码给交了。。
求俩凸多边形面积。水题啊。本来我想了一种方法,想着能水过去呢。一直WA。后来用半平面交算了。。。好久没写半平面交的题了。。。
刚改了点BUG,我的那个方法也水过去啦!!!(*^__^*) 嘻嘻……
我的是M*N的算法,半平面交是log(N+M)*(N+M)的。
我这个就很好想啦,既然是求面积的交,因为是凸多边形,所以两个的交集一定也是凸的(如果存在的话)。
而且稍微想一下就很清楚,交得的凸多边形的顶点要么是交点,要么是在另一个凸多边形里的点。所以把这些个点弄到一个集合里,极角排序,然后求面积即可~~~
需要特判是否一个完全包含另一个,还有不想交的情况~
中间一直WA是因为,求得的点集如果有重点,那么用极角排序(用atan2)是很不靠谱的!!!因为两个相同点的atan2的结果是0!而极角排序是从负值到正值,如果俩点相同,经过极角排序后,它俩不在一起了,哭。所以,在极角排序前去重下就没问题啦。
有很大改进空间滴。。
我的N*M做法
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
#define MID(x,y) ( ( x + y ) >> 1 )
#define L(x) ( x << 1 )
#define R(x) ( x << 1 | 1 )
#define FOR(i,s,t) for(int i=(s); i<(t); i++)
#define BUG puts("here!!!")
#define STOP system("pause")
#define file_r(x) freopen(x, "r", stdin)
#define file_w(x) freopen(x, "w", stdout)
using namespace std;
const int MAX = 510;
const double eps = 1e-6;
bool dy(double x,double y) { return x > y + eps;} // x > y
bool xy(double x,double y) { return x < y - eps;} // x < y
bool dyd(double x,double y) { return x > y - eps;} // x >= y
bool xyd(double x,double y) { return x < y + eps;} // x <= y
bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y
struct point{
double x, y;
void get()
{
scanf("%lf%lf", &x, &y);