萌新求助,WA on 1,2
查看原帖
萌新求助,WA on 1,2
481851
Withers楼主2022/5/30 10:49

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);
}
2022/5/30 10:49
加载中...