Cod sursa(job #1337966)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 9 februarie 2015 17:59:43
Problema Popandai Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <fstream>
#include <algorithm>
#include <iomanip>
#define Nmax 305

using namespace std;
ofstream fout ("popandai.out");

const long double INF=2000000000;

struct el
{
    int nr;
    long double aria;
} v1[Nmax],v2[Nmax];

struct Point
{
    int x,y;
    bool operator <(const Point A) const
    {
        return x<A.x;
    }
} a[Nmax];
int pc[Nmax][Nmax],n,len1,len2,segm[Nmax];
long double minim[Nmax];

inline long long Semn(Point A, Point B, Point C)
{
    return (1LL*(B.y-A.y)*C.x + 1LL*(A.x-B.x)*C.y + 1LL*B.x*A.y - 1LL*A.x*B.y);
}

inline long double Arie(Point A, Point B, Point C)
{
    return 0.5*(double)abs(1LL*A.x*B.y + 1LL*B.x*C.y + 1LL*C.x*A.y - 1LL*C.x*B.y - 1LL*A.x*C.y - 1LL*B.x*A.y);
}

inline int Trapez(int A, int B, int C)
{
    if(a[C].x>=a[A].x && a[C].x<=a[B].x) swap(C,B);
    else
        if(a[C].x<a[A].x)
        {
            swap(A,C); swap(B,C);
        }
    if(Semn(a[A],a[C],a[B])>0)
    {
        int aux;
        if(a[B].x>a[A].x && a[B].x<a[C].x) aux=segm[B];
        else aux=0;
        return pc[A][C]-pc[A][B]-pc[B][C]-aux;
    }
    else return pc[A][B]+pc[B][C]-pc[A][C];
}

inline void Prec()
{
    int i,j;
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            if(a[j].x==a[i].x && a[j].y<=a[i].y) ++segm[i];
}

int main()
{
    int i,j,k,nr;
    long double sol=INF;
    el w;
    ifstream fin ("popandai.in");
    fin>>n>>nr;
    for(i=1;i<=n;++i) fin>>a[i].x>>a[i].y;
    sort(a+1,a+n+1);
    Prec();
    for(i=1;i<=n;++i)
        for(j=i+1;j<=n;++j)
            for(k=1;k<=n;++k)
                if(a[k].x>a[i].x && a[k].x<a[j].x && a[k].y>0 && Semn(a[i],a[j],a[k])>0)
                {
                    ++pc[i][j];
                    ++pc[j][i];
                }
    for(i=1;i<=n;++i)
        for(j=i+1;j<=n;++j) /// AICI !!!!!!!
        {
            long long aux;
            for(k=1,len1=len2=0;k<=n;++k)
            {
                aux=Semn(a[i],a[j],a[k]);
                if(aux>0)
                {
                    w.aria=Arie(a[i],a[j],a[k]);
                    w.nr=Trapez(i,j,k);
                    v1[++len1]=w;
                }
                else
                    if(aux<0)
                    {
                        w.aria=Arie(a[i],a[j],a[k]);
                        w.nr=Trapez(i,j,k);
                        v2[++len2]=w;
                    }
            }
            for(k=0;k<=n;++k) minim[k]=INF;
            for(k=1;k<=len2;++k) minim[v2[k].nr]=min(minim[v2[k].nr],v2[k].aria);
            for(k=n-1;k>=0;--k) minim[k]=min(minim[k+1],minim[k]);
            for(k=1;k<=len1;++k)
                sol=min(sol,minim[max(nr-v1[k].nr,0)]+v1[k].aria);
        }
    fout<<setprecision(2)<<fixed<<sol<<"\n";
    return 0;
}