Cod sursă (job #823315)

Utilizator avatar popescu_george Popescu George popescu_george IP ascuns
Problemă Înfășurătoare convexă Compilator cpp-32 | 1,73 kb
Rundă Arhiva de probleme Status evaluat
Dată 11 mai 2025 08:14:57 Scor 100
/*#include<fstream>
#include<algorithm>
using namespace std;
ifstream cin("infasuratoare.in");
ofstream cout("infasuratoare.out");
#define P pair<int,int>
#define y first
#define x second
P a[100001],b[100001];
bool A(P a,P b,P c)
{
    return 1LL*(a.x-b.x)*(c.y-b.y)<1LL*(a.y-b.y)*(c.x-b.x);
}
int main()
{
    int m=2,n;
    cin>>n;
    for(int i=1;i<=n;cin>>a[i].x>>a[i].y,++i);
    sort(a+1,a+n+1),b[0]=a[1],b[1]=a[2];
    for(int i=3;i<=n;b[m++]=a[i++])
        for(;m>1&&!A(b[m-2],b[m-1],a[i]);--m);
    int k=m-1;
    b[m++]=a[n-1],b[m++]=a[n-2],b[m++]=a[n-3];
    for(int i=n-4;i;b[m++]=a[i--])
        for(;m>k+1&&!A(b[m-2],b[m-1],a[i]);--m);
    --m,cout<<m<<'\n';
    for(int i=0;i<m;cout<<b[i].x<<' '<<b[i].y<<'\n',++i);
    return 0;
}*/
#include <bits/stdc++.h>
#define y first
#define x second
using namespace std;
ifstream in("infasuratoare.in");
ofstream out("infasuratoare.out");
typedef pair <int,int> p;
int n;
p a[100001];
vector <p> s;
bool stanga(p a,p b,p c)
{ return 1LL*(a.x-b.x)*(c.y-b.y)<1LL*(a.y-b.y)*(c.x-b.x);
}
int main()
{ in>>n;
  for(int i=1;i<=n;i++)
    in>>a[i].x>>a[i].y;
  sort(a+1,a+n+1);
  for(int i=1;i<=n;i++)
  { if(s.size()<2)
    { s.push_back(a[i]);
      continue;
    }
    while(s.size()>=2 && !stanga(s[s.size()-2],s[s.size()-1],a[i]))
      s.pop_back();
    s.push_back(a[i]);
  }
  int k=s.size()-1;
  for(int i=n-1;i>=1;i--)
  { if(s.size()<k+2)
    { s.push_back(a[i]);
      continue;
    }
    while(s.size()>=k+2 && !stanga(s[s.size()-2],s[s.size()-1],a[i]))
      s.pop_back();
    s.push_back(a[i]);
  }
  s.pop_back();
  out<<s.size()<<'\n';
  for(auto it:s)
    out<<it.x<<" "<<it.y<<'\n';
  in.close();
  out.close();
  return 0;
}