Advertisement
Guest User

Untitled

a guest
Jan 6th, 2016
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. #define filer() freopen("in.txt","r",stdin)
  2. #define filew() freopen("out.txt","w",stdout)
  3. #include<iostream>
  4. #include<stdio.h>
  5. #include<string.h>
  6. #include<math.h>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<stack>
  10. #include<string>
  11. #include<vector>
  12. #include <map>
  13. #define INF 1<<29
  14. #define PI pair<int,int>
  15. #define SET(a, x) memset((a), (x), sizeof(a))
  16. #define pb push_back
  17. #define i64 long long
  18. #define EPS (1e-9)
  19. using namespace std;
  20. typedef vector<int> VI;
  21. //i64 INF=(i64)((i64)1<<(i64)59);
  22. #define MAX 100005
  23. #define x first
  24. #define y second
  25. typedef pair< int , int > pii;
  26.  
  27. int st[MAX];
  28.  
  29. pair< pii , int > p[MAX],mm;
  30.  
  31. double Dist(pii a,pii b)
  32. {
  33. return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
  34. }
  35.  
  36. int isLeft(pii a,pii b,pii c)
  37. {
  38. return ((c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y));
  39. }
  40.  
  41. bool comp(const pair< pii , int > &a,const pair< pii , int > &b)
  42. {
  43. int tmp = isLeft(mm.x,a.x,b.x);
  44. if(tmp<0) return true;
  45. if(tmp>0) return false;
  46. if(Dist(mm.x,a.x)+EPS<Dist(mm.x,b.x)) return true;
  47. return false;
  48. }
  49.  
  50. int main()
  51. {
  52. //filer();
  53. //int T,cas=0,i,j,y,n,m,k,x;
  54. int T,i,n,top,j,k;
  55. double ans;
  56. scanf("%d",&T);
  57. while(T--)
  58. {
  59. scanf("%d",&n);
  60. int my = INF,mx = INF;
  61. for(i = 0;i<n;i++)
  62. {
  63. scanf("%d %d",&p[i].x.x,&p[i].x.y);
  64. p[i].y = i;
  65.  
  66. }
  67. sort(p,p+n);
  68.  
  69. for(i = 0, k = 0;i<n;i++)
  70. {
  71. p[k++] = p[i];
  72. if(p[i].x.y<my || (p[i].x.y == my && p[i].x.x < mx))
  73. {
  74. my = p[i].x.y;
  75. mx = p[i].x.x;
  76. mm = p[i];
  77. }
  78.  
  79. for(j = i+1;j<n;j++)
  80. {
  81. if(p[i].x.x != p[j].x.x || p[i].x.y != p[j].x.y) break;
  82. }
  83. i = j - 1;
  84. }
  85. n = k;
  86.  
  87. if(n==1)
  88. {
  89. printf("0.00\n1");
  90. }
  91. else
  92. {
  93. int a,b,c;
  94. top = 0;
  95.  
  96. sort(p,p+n,comp);
  97.  
  98. st[top++] = 0;
  99. st[top++] = 1;
  100.  
  101. for(i = 2;i<n;i++)
  102. {
  103. while(top>1)
  104. {
  105. b = st[top-1];
  106.  
  107. a = st[top-2];
  108. c = i;
  109. if(isLeft(p[a].x,p[b].x,p[c].x)<0)
  110. {
  111.  
  112. break;
  113. }
  114. else top--;
  115. }
  116. st[top++] = i;
  117. }
  118. ans = 0;
  119.  
  120. for(i = 0;i<top-1;i++)ans+=Dist(p[st[i]].x,p[st[i+1]].x);
  121.  
  122. ans+=Dist(p[st[top-1]].x,p[st[0]].x);
  123.  
  124. printf("%.2lf\n",ans+EPS);
  125.  
  126. for(i = 0;i<top;i++)
  127. {
  128. if(i) printf(" ");
  129. printf("%d",p[st[i]].y+1);
  130. }
  131.  
  132. printf("\n");
  133. }
  134. if(T) printf("\n");
  135. }
  136.  
  137. return 0;
  138. }
  139. /*
  140. Test Case:
  141.  
  142. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement