Cod sursa(job #2303643)

Utilizator rares9301Sarmasag Rares rares9301 Data 16 decembrie 2018 17:50:51
Problema Popandai Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.3 kb
#include<bits/stdc++.h>

using namespace std;

const int maxN=305;

 

inline int mabs(int x)

{

    return (x>0)?x:(-x);

}

int aria;

int sub[maxN];

int a[maxN][maxN];

int jos[maxN],sus[maxN];

 

pair<int,int> v[maxN];

 

inline int det(int i,int j,int k)

{

    return (v[j].first-v[i].first)*(v[k].second-v[i].second)-(v[k].first-v[i].first)*(v[j].second-v[i].second);

}

 

inline int getpoints(int i,int j,int k)

{

    int p=0;

    if(v[i]>v[j]) swap(i,j);

    if(v[i]>v[k]) swap(i,k);

    if(v[j]<v[k]) swap(j,k);

 

    if(det(i,j,k)<0)

    {

        if(sub[i]!=k && sub[j]!=k)

        {

            p=a[i][j]-a[i][k]-a[k][j]-1;

            if(sub[k]) p++;

        }

            else

        if(sub[i]==k)

        {

            p=a[i][j]-a[k][j]-1;

        }

            else p=a[i][j]-a[i][k]-1;

    }

        else

    {

        if(sub[k]!=i && sub[k]!=j)

        {

            p=a[i][k]+a[k][j]-a[i][j];

            if(sub[k] && det(i,j,sub[k])<0) p--;

        }

            else

        if(sub[k]==i) p=a[k][j]-a[i][j]-1;

            else p=a[i][k]-a[i][j]-1;

    }

    return p;

 

}

int n,k;

int sol;

const int inf=2000000000;

int main()

{

    freopen("popandai.in","r",stdin);

    freopen("popandai.out","w",stdout);

 

 

    scanf("%d%d",&n,&k);

 

    for(int i=1;i<=n;i++)

        scanf("%d%d",&v[i].first,&v[i].second);

 

 

    sol=inf;

 

    sort(v+1,v+n+1);

 

    for(int i=1;i<n;i++)

    {

        for(int j=i+1;j<=n;j++)

        {

            a[i][j]=0;

            for(int k=1;k<=n;k++)

            {

                int aux;

                aux=det(i,j,k);

                if(aux<0 && (v[k].first-v[i].first)*(v[k].first-v[j].first)<=0)

                {

                    a[i][j]++;

                    continue;

                }

            }

            a[j][i]=a[i][j];

            if(v[i].first==v[j].first)

                if(v[i].second<v[j].second) sub[j]=i;

                    else

                if(v[i].second<v[j].second) sub[i]=j;

        }

    }

 

    for(int i=1;i<n;i++)

    {

        for(int j=i+1;j<=n;j++)

        {

            for(int k=0;k<=n+1;k++)

                sus[k]=jos[k]=inf;

 

            for(int k=1;k<=n;k++)

            {

                if(k==i || k==j) continue;

                aria=mabs(det(i,j,k));

                int p=getpoints(i,j,k);

                if(det(i,j,k)<0) jos[p]=min(jos[p],aria);

                    else sus[p]=min(sus[p],aria);

 

            }

            for(int k=n-1;k>=0;k--)

            {

                jos[k]=min(jos[k],jos[k+1]);

                sus[k]=min(sus[k],sus[k+1]);

            }

            for(int t=0;t<=k;t++)

            {

                if(sus[t]!=inf && jos[k-t]!=inf && sus[t]+jos[k-t]<sol)

                    sol=sus[t]+jos[k-t];

 

                if(jos[t]!=inf && sus[k-t]!=inf && jos[t]+sus[k-t]<sol)

                    sol=jos[t]+sus[k-t];

 

 

            }

        }

    }

 

    printf("%d",sol/2);

    if(sol%2) printf(".5\n");

        else printf(".0\n");

    return 0;

}