#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=100001;
const int INF= 1000000000;
int n,top;
struct Point
{
double x,y;
}p[maxn];
Point a[maxn];
double dist(Point sp,Point op)
{
return sqrt((sp.x-op.x)*(sp.x-op.x)+(sp.y-op.y)*(sp.y-op.y));
}
double multiply(Point sp,Point ep,Point op)
{
return ((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
}
bool cmp(const Point &a,const Point &b)
{
double k=multiply(a,b,p[0]);
/*if(k<0) return true;
if(k==0 && dist(a,p[0])>dist(b,p[0]))
return true;
return false;*/
return !(k<0||k==0&&dist(a,p[0])>dist(b,p[0]));
}
void init()
{
freopen("convex.in","r",stdin);
freopen("convex.out","w",stdout);
cin >>n;
p[0].x=p[0].y=INF;
int mini;
for(int i=1;i<=n;i++)
{
cin >>p[i].x>>p[i].y;
if(p[i].y<p[0].y || (p[i].y==p[0].y && p[i].x<p[0].x))
{
p[0].y=p[i].y;
p[0].x=p[i].x;
mini=i;
}
}
p[mini]=p[n--];
sort(p+1,p+n+1,cmp);
}
void work()
{
top=2;
a[1]=p[0];
a[2]=p[1];
for(int i=2;i<=n;i++)
{
double tmp=multiply(a[top],p[i],a[top-1]);
while(top>=2 && tmp<=0)
{
top--;
tmp=multiply(a[top],p[i],a[top-1]);
}
a[++top]=p[i];
}
}
void outi()
{
for(int i=1;i<=top;i++)
printf("%.0lf %.0lf\n", a[i].x,a[i].y);
}
int main()
{
init();
work();
outi();
return 0;
}
凸包 极角序 模板
最新推荐文章于 2021-08-03 19:56:15 发布