Cod sursa(job #2937938)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 11 noiembrie 2022 14:15:45
Problema Popandai Scor 88
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
/// Preset de infoarena
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("popandai.in");
ofstream fout("popandai.out");

const int maxN = 305, inf = 0x3f3f3f3f;
int n, p, ans, nr_pct[maxN][maxN], best_sus[maxN], best_jos[maxN];
struct point {
    int x, y;
    bool operator < (const point &other) const {
        if(x == other.x)
            return y < other.y;
        return x < other.x;
    }
}pct[maxN];

int arie(point a, point b, point c)
{
    /// ax ay 1 )
    /// bx by 1  ) => d = ax * by + ay * cx + bx * cy - by * cx - ay * bx - ax * cy
    /// cx cy 1 )
    return a.x * b.y + a.y * c.x + b.x * c.y - b.y * c.x - a.y * b.x - a.x * c.y;
}

int get_nr_pct(int a, int b, int c)
{
    if(pct[a].x > pct[b].x)
        swap(a, b);
    if(pct[a].x > pct[c].x)
        swap(a, c);
    if(pct[b].x > pct[c].x)
        swap(b, c);
    if(arie(pct[a], pct[b], pct[c]) < 0)
        return nr_pct[a][b] + nr_pct[b][c] - nr_pct[a][c];
    else
        return nr_pct[a][c] - nr_pct[a][b] - nr_pct[b][c] - 1;
}

int main()
{
    fin >> n >> p;
    for(int i = 1; i <= n; i++)
        fin >> pct[i].x >> pct[i].y;
    sort(pct + 1, pct + n + 1);
    for(int i = 1; i <= n; i++)
    {
        for(int j = i + 1; j <= n; j++)
        {
            for(int k = 1; k <= n; k++)
                if(pct[i].x <= pct[k].x && pct[k].x <= pct[j].x && arie(pct[i], pct[j], pct[k]) < 0)
                    nr_pct[i][j]++;
            nr_pct[j][i] = nr_pct[i][j];
        }
    }
    best_jos[n + 1] = -inf;
    best_sus[n + 1] = inf;
    ans = inf;
    for(int i = 1; i <= n; i++)
    {
        for(int j = i + 1; j <= n; j++)
        {
            for(int k = 0; k <= n; k++)
            {
                best_jos[k] = -inf;
                best_sus[k] = inf;
            }
            for(int k = 1; k <= n; k++)
            {
                int nr = get_nr_pct(i, j, k), a = arie(pct[i], pct[j], pct[k]);
                if(a < 0)
                    best_jos[nr] = max(best_jos[nr], a);
                else
                    best_sus[nr] = min(best_sus[nr], a);
            }
            for(int k = n; k >= 0; k--)
            {
                best_jos[k] = max(best_jos[k], best_jos[k + 1]);
                best_sus[k] = min(best_sus[k], best_sus[k + 1]);
            }
            for(int k = 0; k <= p; k++)
            {
                //fout << best_sus[k] << ' ' << best_jos[p - k] << '\n';
                ans = min(ans, best_sus[k] - best_jos[p - k]);
            }
        }
    }
    fout << ans/2;
    if(ans % 2 == 0)
        fout << ".0";
    else
        fout << ".5";
    return 0;
}