题目
思路
凸包模板题
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,top,stack[1000010];
int ans;
struct lzh
{
double x,y;
}p[1000010];
double cj(double x,double y,double xx,double yy,double xx1,double yy1)
{
return (xx-x)*(yy1-y)-(xx1-x)*(yy-y);
}
double dis(double x,double y,double xx,double yy)
{
return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
}
bool cmp(const lzh&h,const lzh&k)
{
double w=cj(p[1].x,p[1].y,h.x,h.y,k.x,k.y);
if(w>0)
return 1;
if(w==0&&dis(h.x,h.y,p[1].x,p[1].y)<dis(k.x,k.y,p[1].x,p[1].y))
return 1;
return 0;
}
int main()
{
scanf("%lld",&n);
for(long long i=1; i<=n; i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
if(i!=1&&p[i].y<p[1].y)
{
swap(p[i].x,p[1].x);
swap(p[i].y,p[1].y);
}
if(i!=1&&p[i].y==p[1].y)
if(p[i].x<p[1].x)
{
swap(p[i].x,p[1].x);
swap(p[i].y,p[1].y);
}
}
sort(p+2,p+1+n,cmp);
stack[1]=1,top=1;
for(long long i=2; i<=n; i++)
{
while(top>1&&cj(p[stack[top-1]].x,p[stack[top-1]].y,p[stack[top]].x,p[stack[top]].y,p[i].x,p[i].y)<=0)
top--;
stack[++top]=i;
}
stack[top+1]=1;
for(long long i=2; i<top; i++)
ans+=cj(p[1].x,p[1].y,p[stack[i]].x,p[stack[i]].y,p[stack[i+1]].x,p[stack[i+1]].y);
printf("%d",abs(ans)/100);
return 0;
}