Cod sursa(job #2259682)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 13 octombrie 2018 17:06:06
Problema Popandai Scor 4
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.02 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=1000000000;
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;
}