HDU1348 Wall 凸包

时间:2024-11-21 12:06:25

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1348

题意:给出一个凸包,求出与凸包距离 L的外圈周长

凸包模板题,练练Andrew算法
求出凸包周长再加上半径为l的圆的周长

 #include<bits/stdc++.h>
#define N 1050
using namespace std;
int n,l,m;
const double pi=acos(-);
struct P{
int x,y;
bool operator < (const P &b)const{
return x==b.x?y<b.y:x<b.x;
}
P operator - (const P &b)const{
return (P){x-b.x,y-b.y};
}
}a[N],s[N];
double dis(P a,P b){
return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
}
int crs(P a,P b){return a.x*b.y-a.y*b.x;}
void getbag(){
m=;sort(a+,a++n);
for(int i=;i<=n;i++){
while(m>&&crs(a[i]-s[m-],s[m]-s[m-])>=)m--;
s[++m]=a[i];
}
int now=m;
for(int i=n-;i>=;i--){
while(m>now&&crs(a[i]-s[m-],s[m]-s[m-])>=)m--;
s[++m]=a[i];
}
if(n>)m--;
} int main(){
int cas;scanf("%d",&cas);
while(cas--){
scanf("%d%d",&n,&l);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
getbag();
double ans=;
for(int i=;i<m;i++)
ans+=dis(s[i],s[i+]);
ans+=dis(s[],s[m]);
ans+=*pi*l;
printf("%.0lf\n",ans);
if(cas)puts("");
}
return ;
}