Cod sursa(job #590097)

Utilizator SpiderManSimoiu Robert SpiderMan Data 15 mai 2011 15:56:24
Problema Popandai Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
# include <algorithm>
# include <cstdio>
# include <cstring>
using namespace std ;

# define a first
# define b second

typedef pair < int, int > PR ;
const char *FIN = "popandai.in", *FOU = "popandai.out" ;
const int MAX = 305, oo = 0x7FFFFFFF ;

PR V[MAX] ;
int sub[MAX][MAX], dp[2][MAX] ;
int N, P ;

inline int area (PR p1, PR p2, PR p3) {
    return p1.a * p2.b + p2.a * p3.b + p3.a * p1.b - p1.a * p3.b - p3.a * p2.b - p2.a * p1.b ;
}

inline int if_ins (int i, int j, int k) {
    if ( V[k] < V[i] ) {
        int X = i;
        i = k, k = j, j = X ;
    } else if ( V[k] < V[j] ) {
        int X = j ;
        j = k, k = X ;
    }
    return abs (sub[i][j] + sub[j][k] - sub[i][k]) - ((V[k].a != V[j].a && (area (V[i], V[k], V[j]) < 0)) + (V[i].a == V[j].a) * 2) ;
}

int main (void) {
    freopen (FIN, "r", stdin) ;

    scanf ("%d %d", &N, &P) ;
    for (int i = 0; i < N; ++i) {
        scanf ("%d %d", &V[i].a, &V[i].b) ;
    }

    sort (V, V + N) ;
    for (int i = 0; i < N; ++i) {
        for (int j = i + 1; j < N; ++j) {
            for (int k = 0; k < N; ++k) {
                if (i != k && j != k && V[i].a <= V[k].a && V[j].a > V[k].a && (area (V[i], V[j], V[k]) < 0)) {
                    ++sub[i][j], ++sub[j][i] ;
                }
            }
        }
    }
    int sol = oo ;
    for (int i = 0; i < N; ++i) {
        for (int j = i + 1; j < N; ++j) {
            for (int k = 0; k < N; ++k) {
                dp[0][k] = dp[1][k] = oo ;
            }
            for (int k = 0; k < N; ++k) {
                if (i != k && j != k) {
                    int ind = area (V[i], V[j], V[k]) < 0, R = if_ins (i, j, k) ;
                    dp[ind][R] = min (dp[ind][R], abs (area (V[i], V[j], V[k]))) ;
                }
            }
            for (int k = N - 2; k + 1; --k) {
                for (int l = 0; l < 2; ++l) {
                    dp[l][k] = min (dp[l][k], dp[l][k + 1]) ;

                }
            }
            for (int k = 0; k <= P; ++k) {
                if (dp[0][k] != oo && dp[1][P - k] != oo) {
                    sol = min (sol, dp[0][k] + dp[1][P - k]) ;
                }
            }
        }
    }
    fprintf ( fopen (FOU, "w"), "%.1lf", sol / 2.0 ) ;
}