RT,用的Andrew,第一个数据输出0,应该为199998
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int n,m,u,v,w,x,y,z,t,l,r,minn=INT_MAX,maxx=INT_MIN,len,res,pos,id,as;
const double eps=1e-8;
int sign(double x)
{
if (fabs(x) < eps) return 0;
if (x < 0) return -1;
return 1;
}
int cmp(double x, double y)
{
if (fabs(x - y) < eps) return 0;
if (x < y) return -1;
return 1;
}
struct p
{
double x,y;
} a[200010],ans[200010];
bool cmp1(p m,p n)
{
if(cmp(m.x,n.x)!=0) return m.x<n.x;
else return m.y<n.y;
}
double mul(p m,p n)
{
return m.x*n.y-m.y*n.x;
}
bool pd(p m,p n,p k)
{
p x=(p){n.x-m.x,n.y-m.y};
p y=(p){k.x-m.x,k.y-m.y};
return mul(x,y)<=0;
}
double dis(p m,p n)
{
return sqrt((m.x-n.x)*(m.x-n.x)+(m.y-n.y)*(m.y-n.y));
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp1);
ans[1]=a[1],ans[2]=a[2];len=2;
for(int i=3;i<=n;i++)
{
while(len>=2&&pd(ans[len-1],ans[len],a[i])) len--;
ans[++len]=a[i];
}
ans[++len]=a[n-1];
for(int i=n-2;i>=1;i--)
{
while(len>=2&&pd(ans[len-1],ans[len],a[i])) len--;
ans[++len]=a[i];
}
double sum=0;
for(int i=1;i<len;i++) sum+=dis(ans[i],ans[i+1]);
printf("%.2lf\n",sum);
}