#include<bits/stdc++.h>
#include<complex>
#define fi(i, a, b) for(int i = a; i < b ; ++i)
#define fd(i, a, b) for(int i = a; i < b ; --i)
using namespace::std;
typedef vector<pair<int, complex< double> > >vz;
typedef pair<int, complex<double> > pr;
typedef complex<double> cx;
bool compy(pr a, pr b)
{
if(imag(a.second) < imag(b.second)) return true;
else if(imag(a.second) == imag(b.second)) return real(a.second) < real(b.second);
return false;
}
bool compol(pr a, pr b)
{
return arg(a.second) < arg(b.second);
}
void update(vz &v, pr ausi, int mode)
{
if(mode == 1)
for(int i = 0 ; i < v.size() ; ++i)
{
v[i].second -= ausi.second;
}
else
for(int i = 0 ; i < v.size() ; ++i)
{
v[i].second += ausi.second;
}
}
double area(pr a, pr b, pr c)
{
return (real(b.second) - real(a.second))*(imag(c.second) - imag(b.second)) - (real(c.second) - real(b.second))*(imag(b.second) - imag(a.second));
}
double perimeter(vz &hull)
{
int i;
double peri = 0.0, x = 0.0;
for(i = 0 ; i < hull.size() -1; ++i)
{
x = sqrt((real(hull[i+1].second) - real(hull[i].second))*(real(hull[i+1].second) - real(hull[i].second)) + (imag(hull[i+1].second) - imag(hull[i].second))*(imag(hull[i+1].second) - imag(hull[i].second)));
peri += x;
}
x = sqrt((real(hull[i].second) - real(hull[0].second))*(real(hull[i].second) - real(hull[0].second)) + (imag(hull[i].second) - imag(hull[0].second))*(imag(hull[i].second) - imag(hull[0].second)));
peri += x;
return peri;
}
int main()
{
int n, T, i=0, x, y;
vz z, hull;
cx ausi;
vector<int> id;
// freopen("ip.txt", "r", stdin);
// freopen("op.txt", "w", stdout);
cin>>T;
while(T--)
{
cin>>n;
if(n == 1)
{
cin>>x>>y;
cout<<"0.00"<<endl<<1<<endl;
}
else
{
id.clear();
hull.clear();
z.clear();
i = 0;
while(i < n)
{
cin>>x>>y;
ausi = complex<double> (x, y);
z.push_back(make_pair(++i, ausi));
}
sort(z.begin(), z.end(), compy);
pr ausi = z[0];
/** translate all the points wrt base point **/
update(z, ausi, 1);
/**sort all the points wrt polar angle**/
stable_sort(z.begin(), z.end(), compol);
/**reset all the points **/
update(z, ausi, 0);
/**lets make the hull**/
hull.push_back(z[0]); id.push_back(z[0].first);
hull.push_back(z[1]); id.push_back(z[1].first);
size_t szz = z.size();
size_t szh = hull.size();
int j;
// cout<<"\nthe points in order are :\n";
// for(auto it : z)
// cout<<it.first<<' '<<it.second<<endl;
for(j = 2 ; j <szz ; ++j)
{
while(area(hull[szh-2], hull[szh-1], z[j])<=0.0)
{
hull.pop_back();
szh--;
id.pop_back();
if(szh == 1)
break;
}
hull.push_back(z[j]);
id.push_back(z[j].first);
szh++;
}
printf("%.2f", perimeter(hull));
cout<<"\n";
for(int i=0;i<id.size(); ++i)
cout<<id[i]<<' ';
cout<<endl<<endl;
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGU8Y29tcGxleD4KI2RlZmluZSBmaShpLCBhLCBiKSBmb3IoaW50IGkgPSBhOyBpIDwgYiA7ICsraSkKI2RlZmluZSBmZChpLCBhLCBiKSBmb3IoaW50IGkgPSBhOyBpIDwgYiA7IC0taSkKCnVzaW5nIG5hbWVzcGFjZTo6c3RkOwoKdHlwZWRlZiB2ZWN0b3I8cGFpcjxpbnQsIGNvbXBsZXg8IGRvdWJsZT4gPiA+dno7CnR5cGVkZWYgcGFpcjxpbnQsIGNvbXBsZXg8ZG91YmxlPiA+IHByOwp0eXBlZGVmIGNvbXBsZXg8ZG91YmxlPiBjeDsKYm9vbCBjb21weShwciBhLCBwciBiKQp7CiAgICBpZihpbWFnKGEuc2Vjb25kKSA8IGltYWcoYi5zZWNvbmQpKSAgcmV0dXJuIHRydWU7CiAgICBlbHNlIGlmKGltYWcoYS5zZWNvbmQpID09IGltYWcoYi5zZWNvbmQpKSByZXR1cm4gcmVhbChhLnNlY29uZCkgPCByZWFsKGIuc2Vjb25kKTsKICAgIHJldHVybiBmYWxzZTsKfQpib29sIGNvbXBvbChwciBhLCBwciBiKQp7CiAgICAgICAgcmV0dXJuIGFyZyhhLnNlY29uZCkgPCBhcmcoYi5zZWNvbmQpOwp9Cgp2b2lkIHVwZGF0ZSh2eiAmdiwgcHIgYXVzaSwgaW50IG1vZGUpCnsKICAgIGlmKG1vZGUgID09IDEpCiAgICBmb3IoaW50IGkgPSAwIDsgaSA8IHYuc2l6ZSgpIDsgKytpKQogICAgewogICAgICAgdltpXS5zZWNvbmQgLT0gYXVzaS5zZWNvbmQ7CiAgICB9CiAgICBlbHNlCiAgICBmb3IoaW50IGkgPSAwIDsgaSA8IHYuc2l6ZSgpIDsgKytpKQogICAgewogICAgICAgIHZbaV0uc2Vjb25kICs9IGF1c2kuc2Vjb25kOwogICAgfQp9CmRvdWJsZSBhcmVhKHByIGEsIHByIGIsIHByIGMpCnsKICAgIHJldHVybiAocmVhbChiLnNlY29uZCkgLSByZWFsKGEuc2Vjb25kKSkqKGltYWcoYy5zZWNvbmQpIC0gaW1hZyhiLnNlY29uZCkpIC0gKHJlYWwoYy5zZWNvbmQpIC0gcmVhbChiLnNlY29uZCkpKihpbWFnKGIuc2Vjb25kKSAtIGltYWcoYS5zZWNvbmQpKTsKfQpkb3VibGUgcGVyaW1ldGVyKHZ6ICZodWxsKQp7CiAgICBpbnQgaTsKICAgIGRvdWJsZSBwZXJpID0gMC4wLCB4ID0gMC4wOwogICAgZm9yKGkgPSAwIDsgaSA8IGh1bGwuc2l6ZSgpIC0xOyArK2kpCiAgICB7CiAgICAgICAgeCA9IHNxcnQoKHJlYWwoaHVsbFtpKzFdLnNlY29uZCkgLSByZWFsKGh1bGxbaV0uc2Vjb25kKSkqKHJlYWwoaHVsbFtpKzFdLnNlY29uZCkgLSByZWFsKGh1bGxbaV0uc2Vjb25kKSkgKyAoaW1hZyhodWxsW2krMV0uc2Vjb25kKSAtIGltYWcoaHVsbFtpXS5zZWNvbmQpKSooaW1hZyhodWxsW2krMV0uc2Vjb25kKSAtIGltYWcoaHVsbFtpXS5zZWNvbmQpKSk7CiAgICAgICAgcGVyaSArPSB4OwogICAgfQoKICAgIHggPSBzcXJ0KChyZWFsKGh1bGxbaV0uc2Vjb25kKSAtIHJlYWwoaHVsbFswXS5zZWNvbmQpKSoocmVhbChodWxsW2ldLnNlY29uZCkgLSByZWFsKGh1bGxbMF0uc2Vjb25kKSkgKyAoaW1hZyhodWxsW2ldLnNlY29uZCkgLSBpbWFnKGh1bGxbMF0uc2Vjb25kKSkqKGltYWcoaHVsbFtpXS5zZWNvbmQpIC0gaW1hZyhodWxsWzBdLnNlY29uZCkpKTsKICAgIHBlcmkgKz0geDsKICAgIHJldHVybiBwZXJpOwp9CmludCBtYWluKCkKewogICAgaW50IG4sIFQsIGk9MCwgeCwgeTsKICAgIHZ6IHosIGh1bGw7CiAgICBjeCBhdXNpOwogICAgdmVjdG9yPGludD4gaWQ7Ci8vICAgICAgZnJlb3BlbigiaXAudHh0IiwgInIiLCBzdGRpbik7Ci8vICAgICAgZnJlb3Blbigib3AudHh0IiwgInciLCBzdGRvdXQpOwogICAgY2luPj5UOwogICAgd2hpbGUoVC0tKQogICAgewogICAgICAgIGNpbj4+bjsKICAgICAgICAgaWYobiA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgY2luPj54Pj55OwogICAgICAgICAgICBjb3V0PDwiMC4wMCI8PGVuZGw8PDE8PGVuZGw7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgIHsKICAgICAgICBpZC5jbGVhcigpOwogICAgICAgIGh1bGwuY2xlYXIoKTsKICAgIHouY2xlYXIoKTsKICAgIGkgPSAwOwogICAgd2hpbGUoaSA8IG4pCiAgICB7CiAgICAgICAgY2luPj54Pj55OwogICAgICAgIGF1c2kgPSBjb21wbGV4PGRvdWJsZT4gKHgsIHkpOwogICAgICAgIHoucHVzaF9iYWNrKG1ha2VfcGFpcigrK2ksIGF1c2kpKTsKICAgIH0Kc29ydCh6LmJlZ2luKCksIHouZW5kKCksIGNvbXB5KTsKcHIgYXVzaSA9IHpbMF07CgovKiogdHJhbnNsYXRlIGFsbCB0aGUgcG9pbnRzIHdydCBiYXNlIHBvaW50ICoqLwp1cGRhdGUoeiwgYXVzaSwgMSk7CgovKipzb3J0IGFsbCB0aGUgcG9pbnRzIHdydCBwb2xhciBhbmdsZSoqLwogc3RhYmxlX3NvcnQoei5iZWdpbigpLCB6LmVuZCgpLCBjb21wb2wpOwovKipyZXNldCBhbGwgdGhlIHBvaW50cyAqKi8KdXBkYXRlKHosIGF1c2ksIDApOwoKLyoqbGV0cyBtYWtlIHRoZSBodWxsKiovCmh1bGwucHVzaF9iYWNrKHpbMF0pOyAgIGlkLnB1c2hfYmFjayh6WzBdLmZpcnN0KTsKaHVsbC5wdXNoX2JhY2soelsxXSk7ICAgaWQucHVzaF9iYWNrKHpbMV0uZmlyc3QpOwpzaXplX3Qgc3p6ID0gei5zaXplKCk7CnNpemVfdCBzemggPSBodWxsLnNpemUoKTsKICAgIGludCBqOwovLyAgICBjb3V0PDwiXG50aGUgcG9pbnRzIGluIG9yZGVyIGFyZSA6XG4iOwovLyAgICBmb3IoYXV0byBpdCA6IHopCi8vICAgICAgICBjb3V0PDxpdC5maXJzdDw8JyAnPDxpdC5zZWNvbmQ8PGVuZGw7CmZvcihqID0gMiA7IGogPHN6eiA7ICsraikKewogICAgd2hpbGUoYXJlYShodWxsW3N6aC0yXSwgaHVsbFtzemgtMV0sIHpbal0pPD0wLjApCiAgICAgICAgewogICAgICAgICAgICBodWxsLnBvcF9iYWNrKCk7CiAgICAgICAgICAgIHN6aC0tOwogICAgICAgICAgICBpZC5wb3BfYmFjaygpOwogICAgICAgICAgICBpZihzemggPT0gMSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAgICAgaHVsbC5wdXNoX2JhY2soeltqXSk7CiAgICAgICAgICAgIGlkLnB1c2hfYmFjayh6W2pdLmZpcnN0KTsKICAgICAgICAgICAgc3poKys7Cn0KICAgIHByaW50ZigiJS4yZiIsIHBlcmltZXRlcihodWxsKSk7CiAgICBjb3V0PDwiXG4iOwogICAgZm9yKGludCBpPTA7aTxpZC5zaXplKCk7ICsraSkKICAgICAgICBjb3V0PDxpZFtpXTw8JyAnOwogICAgY291dDw8ZW5kbDw8ZW5kbDsKICAgIH0KICAgIH0KICByZXR1cm4gMDsKfQoKCg==