未经过题目测试。。。。
struct polygon
{
int n;
Point p[maxp];
Line l[maxp];
void input(int nn)
{
n=nn;
for(int i=0;i<n;i++)
p[i].input();
}
void add(Point q)
{
p[n++]=q;
}
void getline(void)
{
for(int i=0;i<n;i++)
l[i]=Line(p[i],p[(i+1)%n]);
}
struct cmp
{
Point p;
cmp(const Point &p0) {
p=p0;}
bool operator()(const Point &aa,const Point &bb)
{
Point a=aa,b=bb;
int d=sgn((a-p)^(b-p));
if(d==0)
return sgn(a.dis(p)-b.dis(p))<0;
return d>0;
}
};
//进行极角排序
//首先需要找到最左下角的点
//需要重载号好 Point 的 < 操作符 (min 函数要用)
void norm(void)
{
Point mi=p[0];
for(int i=1;i<n;i++) mi=min(mi,p[i]);
sort(p,p+n,cmp(mi));
}
//得到凸包
//得到的凸包里面的点编号是 0∼n-1 的
//两种凸包的方法
//注意如果有影响,要特判下所有点共点,或者共线的特殊情况
void get_convex(polygon &convex)
{
sort(p,p+n);
convex.n=n;
for(int i=0;i<min(n,2);i++)
convex.p[i]=p[i];
if(convex.n==2&&(convex.p[0]==convex.p[1])) convex.n--;
if(n<=2) return ;
int &top=convex.n;
top=