Cod sursa(job #2874975)

Utilizator TeodorMarciucMarciuc Teodor TeodorMarciuc Data 20 martie 2022 16:21:44
Problema Infasuratoare convexa Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include<iostream>
#include<iomanip>
#include<fstream>
#include<algorithm>
using namespace std;
int n,i,j,k,m;
long double A;
struct marciuc{
    long double x,y;
};
marciuc v[120005],st[120005];
double crosspoint(marciuc a,marciuc b,marciuc c){
    return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
bool comparare(marciuc a,marciuc b){
   return crosspoint(v[1],a,b)<0;
}
int main()
{
    ifstream cin("infasuratoare.in");
    ofstream cout("infasuratoare.out");
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>v[i].x>>v[i].y;
    v[n+1]=v[1];
    A=0.0;
    marciuc pct;
    pct.x=1e11;
    pct.y=1e11;
    int pos;
    for(i=1;i<=n;i++)
        if(v[i].y<pct.y)
            pct.y=v[i].y,pct.x=v[i].x,pos=i;
        else if(v[i].y==v[i].y)
            if(v[i].x<pct.x)
            pct.x=v[i].x,pos=i;
        swap(v[pos],v[1]);
        sort(v+2,v+n+1,comparare);
        st[1]=v[1];
        st[2]=v[2];
        int vf=2;
        for(i=3;i<=n;i++){
        while(vf>1 and crosspoint(st[vf-1],st[vf],v[i])>0){
            vf--;
        }
        st[++vf]=v[i];
        }
        cout<<vf<<'\n';
        for(i=vf;i>=1;i--)
            cout<<setprecision(9)<<fixed<<st[i].x<<" "<<setprecision(9)<<fixed<<st[i].y<<'\n';

}