1348

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<vector>
 5 #include<map>
 6 #include<set>
 7 #include<cstring>
 8 #include<cstdio>
 9 #include<cmath>
10 #include<cstdlib>
11 #include<stack>
12 #include<iomanip>
13 #include<cctype>
14 #include<climits>
15 #include<queue>
16 using namespace std;
17 typedef long long ll;
18 typedef unsigned long long ull;
19 
20 struct P
21 {
22     int x,y;
23 
24 };
25 
26 const int maxn=50010;
27 int n,k;
28 P ps[maxn];
29 
30 bool cmp_x(const P& p,const P& q)
31 {
32     if(p.x!=q.x)
33         return p.x<q.x;
34     return p.y<q.y;
35 }
36 
37 int det(P p0,P p1,P p2)
38 {
39     return (p2.x-p0.x)*(p1.y-p0.y)-(p1.x-p0.x)*(p2.y-p0.y);
40 
41 }
42 
43 vector<P> convex_hull(P* ps,int n)
44 {
45     sort(ps,ps+n,cmp_x);
46     k=0;
47     vector<P> qs(n*2);
48     for(int i=0;i<n;i++){
49         while(k>1 && det(qs[k-2],qs[k-1],ps[i])<=0)
50             k--;
51         qs[k++]=ps[i];        
52     }
53     for(int i=n-2,t=k;i>=0;i--){
54         while(k>t && det(qs[k-2],qs[k-1],ps[i])<=0)
55             k--;
56         qs[k++]=ps[i];        
57     }
58     k--;
59     qs.resize(k);
60     return qs;
61 }
62 
63 double dist(P p,P q)
64 {
65     double dis= (p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y);
66     return sqrt(dis);
67 }
68 
69 int main()
70 {
71     int t,r;
72     double ans,l;
73     cin>>t;
74     for(int j=0;j<t;j++){
75         scanf("%d%d",&n,&r);
76         l=2.0*3.14159*r;//常数放前面,且设为浮点型
77         for(int i=0;i<n;i++)
78             scanf("%d %d",&ps[i].x,&ps[i].y);
79         vector<P> qs=convex_hull(ps,n);
80         ans=0;
81         for(int i=0;i<k-1;i++)
82             ans+=dist(qs[i],qs[i+1]);
83         ans+=dist(qs[0],qs[k-1]);
84         ans+=l;
85         printf("%.0f\n",ans);
86         if(j!=t-1)
87             printf("\n");
88     }
89     return 0;
90 
91 }

 

posted @ 2017-01-11 20:53  ooozy  阅读(379)  评论(0编辑  收藏  举报