Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define filer() freopen("in.txt","r",stdin)
- #define filew() freopen("out.txt","w",stdout)
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #include<algorithm>
- #include<queue>
- #include<stack>
- #include<string>
- #include<vector>
- #include <map>
- #define INF 1<<29
- #define PI pair<int,int>
- #define SET(a, x) memset((a), (x), sizeof(a))
- #define pb push_back
- #define i64 long long
- #define EPS (1e-9)
- using namespace std;
- typedef vector<int> VI;
- //i64 INF=(i64)((i64)1<<(i64)59);
- #define MAX 100005
- #define x first
- #define y second
- typedef pair< int , int > pii;
- int st[MAX];
- pair< pii , int > p[MAX],mm;
- double Dist(pii a,pii b)
- {
- return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
- }
- int isLeft(pii a,pii b,pii c)
- {
- return ((c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y));
- }
- bool comp(const pair< pii , int > &a,const pair< pii , int > &b)
- {
- int tmp = isLeft(mm.x,a.x,b.x);
- if(tmp<0) return true;
- if(tmp>0) return false;
- if(Dist(mm.x,a.x)+EPS<Dist(mm.x,b.x)) return true;
- return false;
- }
- int main()
- {
- //filer();
- //int T,cas=0,i,j,y,n,m,k,x;
- int T,i,n,top,j,k;
- double ans;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d",&n);
- int my = INF,mx = INF;
- for(i = 0;i<n;i++)
- {
- scanf("%d %d",&p[i].x.x,&p[i].x.y);
- p[i].y = i;
- }
- sort(p,p+n);
- for(i = 0, k = 0;i<n;i++)
- {
- p[k++] = p[i];
- if(p[i].x.y<my || (p[i].x.y == my && p[i].x.x < mx))
- {
- my = p[i].x.y;
- mx = p[i].x.x;
- mm = p[i];
- }
- for(j = i+1;j<n;j++)
- {
- if(p[i].x.x != p[j].x.x || p[i].x.y != p[j].x.y) break;
- }
- i = j - 1;
- }
- n = k;
- if(n==1)
- {
- printf("0.00\n1");
- }
- else
- {
- int a,b,c;
- top = 0;
- sort(p,p+n,comp);
- st[top++] = 0;
- st[top++] = 1;
- for(i = 2;i<n;i++)
- {
- while(top>1)
- {
- b = st[top-1];
- a = st[top-2];
- c = i;
- if(isLeft(p[a].x,p[b].x,p[c].x)<0)
- {
- break;
- }
- else top--;
- }
- st[top++] = i;
- }
- ans = 0;
- for(i = 0;i<top-1;i++)ans+=Dist(p[st[i]].x,p[st[i+1]].x);
- ans+=Dist(p[st[top-1]].x,p[st[0]].x);
- printf("%.2lf\n",ans+EPS);
- for(i = 0;i<top;i++)
- {
- if(i) printf(" ");
- printf("%d",p[st[i]].y+1);
- }
- printf("\n");
- }
- if(T) printf("\n");
- }
- return 0;
- }
- /*
- Test Case:
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement