Cod sursa(job #2011224)

Utilizator mariusn01Marius Nicoli mariusn01 Data 15 august 2017 17:19:24
Problema Popandai Scor 72
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.64 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#define DIM 310
#define INF 4000000000LL
#define x first
#define y second
using namespace std;

long long det(long long X1, long long Y1, long long X2, long long Y2, long long X3, long long Y3) {
    return (X2-X1)*(Y3-Y1) - (X3-X1)*(Y2-Y1);
}

long long n, i, j, k, K, sol, aria, puncte, t, isol, jsol;
pair<long long, long long> v[DIM];
long long a[DIM][DIM], sub[DIM], sus[DIM], jos[DIM];

long long getPoints(pair<long long, long long> i, pair<long long, long long> j, pair<long long, long long> k, long long pi, long long pj, long long pk) {
    long long puncte = 0;
    if (i > j)
        swap(i, j), swap(pi, pj);
    if (i > k)
        swap(i, k), swap(pi, pk);
    if (j < k)
        swap(j, k), swap(pj, pk);

    if (det(i.x, i.y, j.x, j.y, k.x, k.y) < 0) {

        /// k este sub
        if (sub[pi] != pk && sub[pj] != pk) {
            puncte = a[pi][pj] - a[pi][pk] - a[pk][pj] - 1;
            if (sub[pk])
                puncte++;
        } else
            if (sub[pi] == pk) {
                puncte = a[pi][pj] - a[pk][pj] - 1;
            } else
                puncte = a[pi][pj] - a[pi][pk] - 1;
    } else
        if (det(i.x, i.y, j.x, j.y, k.x, k.y) > 0) {
            if (sub[pk] != pi && sub[pk] != pj) {
                puncte = a[pi][pk] + a[pk][pj] - a[pi][pj];
                if (sub[pk] && det(i.x, i.y, j.x, j.y, v[ sub[pk] ].x, v[ sub[pk] ].y) < 0)
                    puncte--;
            } else
                if (sub[pk] == pi)
                    puncte = a[pk][pj] - a[pi][pj] - 1;
                else
                    puncte = a[pi][pk] - a[pi][pj] - 1;
        }
    return puncte;
}

inline long long modul(long long x) {
    return (x > 0 ? x : -x);
}

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

    //cout<<det(0, 0, 1, 0, 1, -1);

    fin>>n>>K;
    for (i=1;i<=n;i++)
        fin>>v[i].x>>v[i].y;

    //for (i=1;i<=n;i++)
    //    cout<<v[i].x<<" "<<v[i].y<<"\n";

    sol = INF;
    sort(v+1, v+n+1);
    for (i=1;i<n;i++)
        for (j=i+1;j<=n;j++) {
            a[i][j] = 0;
            for (k=1;k<=n;k++) {
                if ((v[k].x - v[i].x) * (v[k].x - v[j].x) <= 0 &&
                    (v[k].y - v[i].y) * (v[k].y - v[j].y) <= 0 &&
                    det(v[i].x, v[i].y, v[j].x, v[j].y, v[k].x, v[k].y) == 0
                    ) {
                    continue;
                }
                long long aux;
                if ((aux = det(v[i].x, v[i].y, v[j].x, v[j].y, v[k].x, v[k].y)) < 0 &&
                    (v[k].x - v[i].x) * (v[k].x - v[j].x) <= 0) {
                    a[i][j]++;
                    continue;
                }
            }
            a[j][i] = a[i][j];

            if (v[i].x == v[j].x) {
                if (v[i].y < v[j].y)
                    sub[j]= i;
                else
                    if (v[j].y < v[i].y)
                        sub[i] = j;
            }

        }
/*
    for (i=1;i<=n;i++) {
        for (j=1;j<=n;j++)
            cout<<a[i][j]<<" ";
        cout<<"\n";
    }
*/
    for (i=1;i<n;i++)
        for (j=i+1;j<=n;j++) {
            for (k=0;k<=n+1;k++)
                sus[k] = jos[k] = INF;
            for (k=1;k<=n;k++){

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

                aria = modul( det(v[i].x, v[i].y, v[j].x, v[j].y, v[k].x, v[k].y) );
                puncte = getPoints(v[i], v[j], v[k], i, j, k);
                if (puncte < 0)
                    cout<<puncte<<"\n";
                if (det(v[i].x, v[i].y, v[j].x, v[j].y, v[k].x, v[k].y) < 0) {
                    jos[puncte] = min(jos[puncte], aria);
                } else {
                    sus[puncte] = min(sus[puncte], aria);
                }
            }

            for (k=n-1;k>=0;k--) {
                sus[k] = min(sus[k], sus[k+1]);
                jos[k] = min(jos[k], jos[k+1]);
            }

            for (t = 0; t<=K; t++) {
                if (sus[t] + jos[K-t] < sol) {
                    sol = sus[t] + jos[K-t];
                    isol = i;
                    jsol = j;
                }
                if (jos[t] + sus[K-t] < sol) {
                    sol = jos[t] + sus[K-t];
                    isol = i;
                    jsol = j;
                }

//                sol = min(sol, sus[t] + jos[K-t]);
//                sol = min(sol, jos[t] + sus[K-t]);
            }
        }

    fout<<sol/2;
    if (sol % 2 == 0)
        fout<<".0\n";
    else
        fout<<".5\n";

    cout<<isol<<" "<<jsol;

    return 0;
}