Cod sursă (job #817713)

Utilizator avatar andronas Matei Andronache andronas IP ascuns
Problemă Înfășurătoare convexă Compilator cpp-32 | 1,65 kb
Rundă Arhiva de probleme Status evaluat
Dată 2 apr. 2025 17:48:57 Scor 20
#define _USE_MATH_DEFINES
#include <fstream>
#include <algorithm>
#include <cmath>

using namespace std;
ifstream cin ("infasuratoare.in");
ofstream cout ("infasuratoare.out");
struct punct{
int x,y;
long double u;
bool ok;
}v[100001],s[100002],m;
bool compare (punct p,punct q)
{
  return p.u<q.u;
}
int sens (punct A,punct B,punct C)
{
  long long delta=(B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);
  return delta;
}

int main()
{
    int n;
    cin>>n;
    m.x=1000000001;
    m.y=1000000001;
    int poz=1;
    for (int i=1;i<=n;i++)
    {
      cin>>v[i].x>>v[i].y;
      if (v[i].y==m.y)
      {
          if (v[i].x<m.x)
          {
              m=v[i];
              poz=i;
          }

      }
      if (v[i].y<m.y)
      {
          m=v[i];
          poz=i;
      }
    }
    swap(v[1],v[poz]);
    for (int i=2;i<=n;i++)
    {
        v[i].u=atan2(v[i].y-m.y,v[i].x-m.x);
    }
    sort (v+2,v+n+1,compare);

    /*for (int i=1;i<=n;i++)
    {
      cout<<v[i].x<<" "<<v[i].y<<" "<<v[i].u<<endl;
    }
    //cout<<atan2(-1,-1)*180.0/M_PI;*/
    int t=2;
    s[1]=v[1];
    s[2]=v[2];
    for (int i=3;i<=n;i++)
    {
        while (t>=2 && sens(s[t-1],s[t],v[i])<0)
       {
           t--;
       }
       t++;
       s[t]=v[i];
    }
    int k=t;
    //cout<<t<<'\n';
    t++;
    s[t]=s[1];
    /*for (int i=2;i<t;i++)
    {
        if (sens (s[i-1],s[i],s[i+1])==0)
        {
            s[i].ok=1;
            k--;
        }
    }*/
    cout<<k<<'\n';
    for (int i=1;i<t;i++)
    {
        if (s[i].ok==0)
        cout<<s[i].x<<" "<<s[i].y<<'\n';
    }
    return 0;
}