Cod sursa(job #1670063)

Utilizator obi10Rob Aro obi10 Data 31 martie 2016 13:37:25
Problema Infasuratoare convexa Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;


ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");

struct p
{
    double x;
    double y;
};

p v[120002],a[120002];

bool cmp(p a,p b)
{
return (b.x*a.y>a.x*b.y);
}
int main()
{
    int i,n,k=4,j,r;
    double minix=1000000002,miniy=1000000002,s,q;
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>v[i].x>>v[i].y;
        if(v[i].x<minix)
            minix=v[i].x;
        if(v[i].y<miniy)
            miniy=v[i].y;
    }
    if(minix<0)
        for(i=1;i<=n;i++)
        v[i].x=v[i].x+minix;
    if(miniy<0)
        for(i=1;i<=n;i++)
        v[i].y=v[i].y+miniy;
    sort(v+1,v+n+1,cmp);
    v[n+1]=v[1];
    a[1]=v[1];
    a[2]=v[2];
    a[3]=v[3];
    j=2;

    for(i=4;i<=n;i++)
    {
        s=a[j].x*a[j+1].y+a[j+1].x*v[i].y+a[j].y*v[i].x-v[i].x*a[j+1].y-a[j+1].x*a[j].y-v[i].y*a[j].x;
        if(s>0)
        {
            r=j-1;
            s=a[j].x*a[j+1].y+a[j+1].x*v[i].y+a[j].y*v[i].x-v[i].x*a[j+1].y-a[j+1].x*a[j].y-v[i].y*a[j].x;
            q=a[r].x*a[r+1].y+a[r+1].x*v[i].y+a[r].y*v[i].x-v[i].x*a[r+1].y-a[r+1].x*a[r].y-v[i].y*a[r].x;
            while(q>s)
                {
                    r--;
                    k--;
            q=a[r].x*a[r+1].y+a[r+1].x*v[i].y+a[r].y*v[i].x-v[i].x*a[r+1].y-a[r+1].x*a[r].y-v[i].y*a[r].x;
                }
            a[k-1]=v[i];
        }
        else
        {
            a[k]=v[i];
            k++;
            j++;
        }
    }
    for(i=k-1;i>=1;i--)
        g<<setprecision (7)<<a[i].x<<' '<<setprecision (7)<<a[i].y<<'\n';
    return 0;
}