Cod sursa(job #690082)

Utilizator Sm3USmeu Rares Sm3U Data 25 februarie 2012 10:27:32
Problema Infasuratoare convexa Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <stack>
#define nMax 120010
#define infinit 2000000000

using namespace std;

struct pct{
    double x;
    double y;
    double panta;
}puncte[nMax];

int n;
int stiva[nMax];
int nStiva;



struct cmp{
    bool operator() (const pct &a, const pct &b)const{
        return a.panta > b.panta;
    }
};

inline double Panta(pct a, pct b){
    if(a.x == b.x){
        return infinit;
    }
    return (a.y - b.y)/(a.x - b.x);
}

inline double determinant(pct a, pct b, pct c){
    return a.x * b.y + a.y * c.x + b.x * c.y - b.y * c.x - c.y * a.x - a.y * b.x;
}

void citire()
{
    int max = 0; // am fol max ca imi place culoarea
    ifstream fin("infasuratoare.in");
    fin >> n;
    for (int i = 0; i < n; ++ i){
        fin >> puncte[i].x >> puncte[i].y;
        if (puncte[max].x >= puncte[i].x){
            if (puncte[max].x == puncte[i].x){
                if( puncte[max].y >= puncte[i].y){
                    max = i;
                }else{
                    continue;
                }
            }
            max = i;
        }
    }
    for (int i = 0; i < n; ++ i){
        puncte[i].panta = Panta(puncte[max],puncte[i]);
    }
    puncte[max].panta = infinit + 1;
    sort(puncte, puncte + n, cmp());
}

void rez()
{
    stiva[nStiva ++] = 0;
    stiva[nStiva ++] = 1;
    for(int i = 2; i < n; ++ i){
        while (determinant (puncte[stiva[nStiva - 1]], puncte[stiva[nStiva - 2]], puncte[i]) < 0){
            nStiva --;
        }
        stiva[nStiva ++] = i;
    }
    printf ("%d\n", nStiva);
    for (int i = nStiva - 1; i >= 0; -- i){
        printf("%llf %llf\n",puncte[stiva[i]].x, puncte[stiva[i]].y);
    }
}

int main()
{
    //freopen ("infasuratoare.in", "r", stdin);
    freopen ("infasuratoare.out", "w", stdout);
    citire();
    rez();

    return 0;
}