Cod sursa(job #1335041)

Utilizator raulmuresanRaul Muresan raulmuresan Data 4 februarie 2015 21:26:52
Problema Infasuratoare convexa Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <cstdio>
#include <algorithm>
#include<vector>
#include<stack>
#include<set>
#include<cstdio>
#include<string>
#include<cmath>
#define inf 0x3f3f3f3f

using namespace std;

int i,n,k,j,p,s,unu,m,doi,q,dr,maxim,maxi2,val,cont,sol,z,ind[120009],orig,stiva[120009],vf;


struct punct
{
    double x,y;
}v[120010];


/*inline double panta(int a, int b)
{
    if(v[a].x==v[b].x)
        return inf;
    return (v[b].y-v[a].y)/(v[b].x-v[a].x);
};

struct cmp
{
    bool operator () (const int &a, const int &b)
    {
        return panta(a,orig)<panta(b,orig);
    }
};*/

bool cmp(punct i,punct j)
{
    return atan2(i.y-v[orig].y,i.x-v[orig].x)<atan2(j.y-v[orig].y,j.x-v[orig].x);
}

inline double semn( int A, int B, int C ) {

    return ( double )v[ A ].x*v[ B ].y + v[ B ].x*v[ C ].y + v[ C ].x*v[ A ].y - v[ A ].y*v[ B ].x - v[ B ].y*v[ C ].x - v[ C ].y*v[ A ].x;
}


ifstream fin("infasuratoare.in");




int main()
{
    freopen("infasuratoare.out","w",stdout);
    fin>>n;
    orig=1;
    for(i=1;i<=n;++i)
    {
        fin>>v[i].x >>v[i].y;
        //cautam punctul cu x-ul cel mai mic...in caz de egalitate luam pnctul cu y minim
        if(v[i].x<v[orig].x || (v[i].x==v[orig].x && v[i].y<v[orig].y))
        {
            orig=i;
        }
        ind[i]=i;
    }
    printf("%d\n",orig);
    //sortare in functie de panta facuta cu cel mai din stanga punct
    sort(v+1,v+n+1,cmp);

    for(i=1;i<=n;i++)
    {
       // fout<<v[i].x<<" "<<v[i].y<<"\n";
        printf("%lf %lf %d\n",v[i].x,v[i].y,ind[i]);
    }
    vf=1;
    stiva[vf]=orig;

    for( i = 1; i <= n; i++ ){
        if( i != orig ) {

            for( ; vf >= 2 && semn( stiva[ vf-1 ], stiva[ vf ], i ) < 0; --vf );
            stiva[ ++vf ] = i;
        }
    }


    printf("%d\n",vf);
    for(i=1;i<=vf;i++)
    {
        printf("%lf %lf\n",v[stiva[i]].x,v[stiva[i]].y);
    }
}