Cod sursa(job #2096111)

Utilizator Bodo171Bogdan Pop Bodo171 Data 28 decembrie 2017 16:46:42
Problema Popandai Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <climits>
#define x first
#define y second
#define point pair<long long,long long>
using namespace std;
const int nmax=305;
point v[nmax];
int a[nmax][nmax];
long long best[2][nmax];
int oth[nmax];
long double ans;
int n,Kn,i,j,k,ind,cate,where,rr,mid;
bool comp(point unu,point doi)
{
    if(unu.x==doi.x) return unu.y<doi.y;
    return unu.x<doi.x;
}
long long det(point A,point B,point C)
{
    return (1LL*A.x*B.y+1LL*B.x*C.y+1LL*C.x*A.y-1LL*A.y*B.x-1LL*B.y*C.x-1LL*C.y*A.x);
}
int under(point A,point B,point P)
{
    if(A.x>B.x) swap(A,B);
    if(P.x>A.x&&P.x<B.x)
    {
        return (det(A,B,P)<0);
    }
    return 0;
}
long long abss(long long x)
{
    if(x<0) return -x;
    return x;
}
int in()
{
    if(i<k&&k<j)
    {
        mid=k;
        return abss(a[i][k]+a[k][j]-a[i][j])-under(v[i],v[j],v[k]);
    }
    if(k<i)
    {
        mid=i;
        return abss(a[k][i]+a[i][j]-a[k][j])-under(v[j],v[k],v[i]);
    }
    if(k>j)
    {
        mid=j;
        return abss(a[i][j]+a[j][k]-a[i][k])-under(v[i],v[k],v[j]);
    }
    return 0;
}
int intr(point A,point B,point C,point D)
{
    return (1LL*abss(det(A,B,D))+abss(det(B,C,D))+abss(det(A,C,D))==abss(det(A,B,C)));
}
void prp(long long &a,long long b)
{
    if(b<a)
        a=1LL*b;
}
int main()
{
    ifstream f("popandai.in");
    ofstream g("popandai.out");
    f>>n>>Kn;
    for(i=1;i<=n;i++)
    {
        f>>v[i].x>>v[i].y;
    }
    sort(v+1,v+n+1,comp);
    for(i=2;i<=n;i++)
    {
        if(v[i-1].x==v[i].x)
            oth[i]=i-1;
    }
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
          for(k=1;k<=n;k++)
            if(i!=k&&k!=j&&under(v[i],v[j],v[k]))
    {
        a[i][j]++;
        a[j][i]++;
    }
    ans=INT_MAX;
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
    {
        for(k=0;k<2;k++)
            for(ind=0;ind<=Kn;ind++)
              best[k][ind]=(1<<30)-1;
        for(k=1;k<=n;k++)
            if(k!=i&&k!=j)
        {
            cate=in();
            if(oth[mid]&&i!=oth[mid]&&j!=oth[mid]&&k!=oth[mid]&&intr(v[i],v[j],v[k],v[oth[mid]]))
                cate++;
            where=(det(v[i],v[j],v[k])<0);
            prp(best[where][min(cate,Kn)],abs(det(v[i],v[j],v[k])));
        }
        for(k=0;k<2;k++)
            for(ind=Kn-1;ind>=0;ind--)
               best[k][ind]=min(best[k][ind],best[k][ind+1]);
        for(ind=0;ind<=Kn;ind++)
        {
            if(best[0][ind]+best[1][Kn-ind]<ans)
                ans=best[0][ind]+best[1][Kn-ind];
        }
    }
    g<<fixed<<setprecision(1)<<ans/2;
    return 0;
}