Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define mp make_pair
- #define maxn 200002
- int T, n;
- int x[maxn], y[maxn];
- vector<pair<pair<int, int>, int> > v;
- vector<int> oto, oto2;
- int wek(int a, int b, int c){
- return ((x[b]-x[a])*(y[c]-y[a]))-((y[b]-y[a])*(x[c]-x[a]));
- }
- long double len(int a, int b){
- long double dx=abs(x[a]-x[b]);
- long double dy=abs(y[a]-y[b]);
- return sqrt(dx*dx+dy*dy);
- }
- void find_conv(){
- oto.clear();
- oto2.clear();
- oto.push_back(v[0].second);
- oto.push_back(v[1].second);
- for(int i=2; i<n; i++){
- while(oto.size()>=2 && wek(oto[oto.size()-2], oto.back(), v[i].second)<0) oto.pop_back();
- oto.push_back(v[i].second);
- }
- oto2.push_back(v.back().second);
- oto2.push_back(v[v.size()-2].second);
- for(int i=n-3; i>=0; i--){
- while(oto2.size()>=2 && wek(oto2[oto2.size()-2], oto2.back(), v[i].second)<0) oto2.pop_back();
- oto2.push_back(v[i].second);
- }
- }
- void answer(){
- long double odp=0;
- for(int i=1; i<oto.size(); i++){
- odp+=len(oto[i-1], oto[i]);
- }
- for(int i=1; i<oto2.size(); i++){
- odp+=len(oto2[i-1], oto2[i]);
- }
- long long ile=ceil(odp/150);
- printf("%lld ", ile);
- for(int i=0; i<oto.size(); i++){
- printf("%d ", oto[i]);
- }
- for(int i=1; i<oto2.size()-1; i++){
- printf("%d ", oto2[i]);
- }
- printf("\n");
- }
- int main(){
- scanf("%d", &T);
- for(int q=1; q<=T; q++){
- scanf("%d", &n);
- int a, b;
- v.clear();
- for(int i=1; i<=n; i++){
- scanf("%d%d", &a, &b);
- x[i]=a;
- y[i]=b;
- v.push_back(mp(mp(a, b), i));
- }
- sort(v.begin(), v.end());
- find_conv();
- answer();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement