Cod sursa(job #1933985)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 21 martie 2017 01:11:12
Problema Popandai Scor 72
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.01 kb
#include <fstream>
#include <iomanip>
using namespace std;
ifstream f("popandai.in");
ofstream g("popandai.out");
long long N, K;
pair <long long, long long> Array[305];
long long U[305][305];
long long Max[2][305];
long long Min[30005];

long long res = 1000000000;
void Read()
{
    f >> N >> K;
    for(long long i = 0; i <= 30000; i++)
        Min[i] = -1;
    for(long long i = 1; i <= N; i++)
    {
        f >> Array[i].first >> Array[i].second;
        if(Min[Array[i].first] == -1)
        {
            Min[Array[i].first] = Array[i].second;
        }
        else
            Min[Array[i].first] = min(Array[i].second, Min[Array[i].first]);
    }

}

inline long long Area(pair <long long, long long> a, pair <long long, long long> b, pair <long long, long long> c)
{
    return a.first * b.second + b.first * c.second + c.first * a.second - a.second * b.first - b.second * c.first - c.second * a.first;
}
inline bool under(pair <long long, long long> x, pair <long long, long long> y, pair <long long, long long> z)
{
    pair <long long, long long> a = x, b = y;
    if(a.first > b.first)
        swap(a, b);
    if(a.first > z.first || b.first < z.first)
        return 0;
    if(Area(a, b, z) < 0)
        return 1;
    return 0;
}
void precalcUnder()
{
    for(long long i = 1; i <= N; i++)
        for(long long j = i + 1; j <= N; j++)
        {
            long long ans = 0;
            for(long long k = 1; k <= N; k++)
            {
                if(k == i || k == j)
                    continue;
                pair <long long, long long> a = Array[i], b = Array[j];
                if(a.first > b.first)
                    swap(a, b);
                if(under(Array[i], Array[j], Array[k]) == 1)
                    ++U[i][j];
            }
            U[j][i] = U[i][j];
        }
}
void Solve()
{
    for(long long i = 1; i <= N; i++)
        for(long long j = i + 1; j <= N; j++)
        {
            for(long long k = 0; k <= K; k++)
                Max[0][k] = Max[1][k] = 1000000000;
            long long ans = 0;
            if(i == 5 && j == 8)
            {
                long long p;
                p = 0;
            }
            for(long long k = 1; k <= N; k++)
            {
                if(k == i || k == j)
                    continue;
                long long poz;
                //if(Area(Array[i], Array[j], ))
                pair <long long, long long> a = Array[i], b = Array[j], c = Array[k];
                long long ind1 = i, ind2 = j, ind3 = k;
                if(a > b)
                    swap(a, b), swap(ind1, ind2);
                if(Area(a, b, Array[k]) > 0)
                    poz = 0;
                else
                    poz = 1;
                if(a > c)
                    swap(a, c), swap(ind1, ind3);
                if(b > c)
                    swap(b, c), swap(ind2, ind3);
                long long number;
                if(Area(a, c, b) < 0)
                {
                    long long add = 0;
                    if(Min[b.first] != b.second)
                        ++add;
                    number = U[ind1][ind3] - U[ind2][ind1] - U[ind2][ind3] - 1 + add;
                    Max[poz][number] = min(Max[poz][number], -Area(a, c, b));
                }
                else
                {
                    long long add = 0;
                     if(Min[b.first] != b.second)
                        ++add;
                    number = U[ind2][ind1] + U[ind2][ind3] - U[ind1][ind3] - add;
                    Max[poz][number] = min(Max[poz][number], Area(a, c, b));
                }
            }
            for(long long k = 0; k <= K; k++)
            {
                if(Max[0][k] == 0 || Max[1][K - k] == 0)
                    continue;
                res = min(res, Max[0][k] + Max[1][K - k]);
            }
        }
    g << fixed << setprecision(1) << (double) res / 2.0 << "\n";
}
int main()
{
    Read();
    precalcUnder();
    Solve();
    return 0;
}