Cod sursă (job #517772)

Utilizator avatar marian013 Marian marian013 IP ascuns
Problemă Înfășurătoare convexă Compilator cpp | 0,90 kb
Rundă Arhiva de probleme Status evaluat
Dată 10 ian. 2020 20:52:10 Scor 0
#include<fstream>
#include<vector>
#include <algorithm>
#include <iomanip>
using namespace std;
ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");
#define N 130000
#define x first
#define y second
typedef pair<double,double> punct;
punct v[N],s[N];
double unghi(punct O,punct A, punct B){
    return (A.x-O.x)*(B.y-O.y)-(A.y-O.y)*(B.x-O.x);
}
bool cmp(punct A, punct B){
    return unghi(v[1],A,B)<0;
}
int main()
{
    int n,c=1;
    f>>n;
    for(int i=1;i<=n;i++)
        f>>v[i].x>>v[i].y;
    for(int i=2;i<=n;i++)
        if(v[c]>v[i])
            c=i;
    swap(v[c],v[1]);
    sort(v+2,v+n+1,cmp);
    s[1]=v[1];s[2]=v[2];c=2;
    for(int i=3;i<=n;i++)
    {
        while(c>=2&&unghi(s[c-1],s[c],v[i])>0)
            c--;
        s[++c]=v[i];
    }
    g<<c<<"\n";
    for(int i=c;i>=1;i--)
        g<<fixed<<setprecision(9)<<s[i].x<<" "<<s[i].y<<"\n";

}