Cod sursa(job #3159136)

Utilizator dragosdragonnIosub Dragos Casian dragosdragonn Data 20 octombrie 2023 19:26:50
Problema Infasuratoare convexa Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;
ifstream fin("infasuratoare.in");
ofstream fout("infasuratoare.out");
struct punct{
  double x,y;
};
int n;
int cntpoligon;
punct a[120005];
punct poligon[120005];
bool comparator(punct a,punct b)
{
    if(a.x<b.x)
        return 1;
    if(a.x>b.x)
        return 0;
    if(a.x==b.x)
    {
        return (a.y<=b.y);
    }
}
int determinant(punct p,punct q,punct r)
{
    int det=(q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y);
    if (det==0)
    return 0;
    if(det>0)
    return 1;
    if(det<0)
    return 2;
}
void fpoligonsus()
{
     for(int i=1;i<n;i++)
     {
         while(cntpoligon>=2 && determinant(poligon[cntpoligon-2],poligon[cntpoligon-1],a[i])!=1)
         {
             cntpoligon--;
         }
         poligon[cntpoligon++]=a[i];
     }
}
void fpoligonjos()
{
    for(int i=n-2;i>=0;i--)
    {
        while(cntpoligon>=2 && determinant(poligon[cntpoligon-2],poligon[cntpoligon-1],a[i])!=1)
        {
            cntpoligon--;
        }
        poligon[cntpoligon++]=a[i];

    }
}
int main()
{
    fin>>n;
    for(int i=0;i<n;i++)
    {
        fin>>a[i].x>>a[i].y;
    }
    sort(a,a+n,comparator);
    poligon[cntpoligon++]=a[0];
    fpoligonsus();
    fpoligonjos();
    cntpoligon--;
    fout<<cntpoligon<<'\n';
    for(int i=cntpoligon-1;i>=0;i--)
        fout<<fixed<<setprecision(6)<<poligon[i].x<<" "<<fixed<<setprecision(6)<<poligon[i].y<<'\n';
    return 0;
}