您的位置:首页 > 其它

poj 1113(凸包入门)

2014-04-15 23:30 302 查看
没什么说的,福利题,自然要秒了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const double pi=acos(-1.0);
struct P
{
double x,y;
P () {}
P (double x,double y):x(x),y(y){
}
P operator -(P p){
return P(x-p.x,y-p.y);
}
double det(P p){
return x*p.y-y*p.x;
}
};
double dis(P a,P b)
{
double c=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
return sqrt(c);
}
bool cmp(P a,P b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
P q[100000],qs[100000];
int k,n,r;
int main()
{
while(~scanf("%d%d",&n,&r))
{
k=0;
for(int i=0;i<n;i++)
scanf("%lf%lf",&q[i].x,&q[i].y);
sort(q,q+n,cmp);
for(int i=0;i<n;i++)
{
while(k>1 && (qs[k-1]-qs[k-2]).det(q[i]-qs[k-2])<=0) k--;
qs[k++]=q[i];
}
for(int i=n-1,t=k;i>=0;i--)
{
while(k>t && (qs[k-1]-qs[k-2]).det(q[i]-qs[k-2])<=0) k--;
qs[k++]=q[i];
}
double sum=0.0;
for(int i=0;i<k-1;i++)
{
sum+=dis(qs[i],qs[i+1]);
// printf("%lf\n",sum);
}
printf("%.0lf\n",sum+2*pi*(double)r);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: