[CQOI2006]凸多边形

题目

wdnmd可算调出来了,以后我也是会半平面交的人了

由于给定的是一些凸包,我们直接按照逆时针把所有直线搞下来,我们默认保留直线左边的半平面;之后我们就可以按照极角序把直线排序,对于两条极角相等的直线,显然是更靠近左边的优,于是我们只保留最靠左的直线

与凸包不同的是,我们使用一个双端队列维护半平面交,对于一条要插入的直线\(l\),我们发现队尾两条直线的交点\(p\)\(l\)的右侧,那么就说明队尾的直线没啥用了,就弹出去;同理,如果队首两条直线的交点在\(l\)右侧,也将队首直线弹出

可以康康这个老哥博客里的图

最后还有可能出现队尾两条直线的交点在队首直线的右侧的情况,对于这种情况我们弹掉队尾就好了

代码

#include
#define re register
const int maxn=505;
struct Point{double x,y;}p[maxn],a[maxn],S;
const double eps=1e-8;
int n,cnt,tot,h,t,tmp;
struct Line{Point s,t;double det;}L[maxn],q[maxn];
inline Point operator+(Point A,Point B) {return (Point){A.x+B.x,A.y+B.y};}
inline Point operator-(Point A,Point B) {return (Point){A.x-B.x,A.y-B.y};}
inline Point operator^(double g,Point C) {return (Point){C.x*g,C.y*g};}
inline double operator*(Point A,Point B) {return A.x*B.y-B.x*A.y;}
inline int dcmp(double A,double B) {return A+eps>B&&A-eps0;
}
inline int cmp(const Line &A,const Line &B) {
    return dcmp(A.det,B.det)?OnRight(A.s,B):(A.det

你可能感兴趣的:([CQOI2006]凸多边形)