Cod sursa(job #2414242)

Utilizator robx12lnLinca Robert robx12ln Data 24 aprilie 2019 13:13:21
Problema Popandai Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include<bits/stdc++.h>
using namespace std;

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

const int INF = numeric_limits<int>::max();

int cnt[305][305], N, K, under[305], over[305], ans;
pair<int,int> P[305];

inline int det( int s1, int s2, int p ){
    return ( P[s2].first - P[s1].first ) * ( P[p].second  - P[s1].second ) -
           ( P[p].first  - P[s1].first ) * ( P[s2].second - P[s1].second );
}

inline int get_nr( int i, int j, int k ){
    if( P[i].first > P[j].first ) swap( i, j );
    if( P[i].first > P[k].first ) swap( i, k );
    if( P[j].first > P[k].first ) swap( j, k );
    /// am i, j, k in ordine dupa x
    if( det( i, k, j ) > 0 )
        return cnt[i][j] + cnt[j][k] - cnt[i][k];
    else
        return cnt[i][k] - cnt[i][j] - cnt[j][k] - 1;
}

int main(){

    fin >> N >> K;
    for( int i = 1; i <= N; i++ )
        fin >> P[i].first >> P[i].second;
    sort( P + 1, P + 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( det( i, j, k ) < 0 && P[i].first <= P[k].first && P[k].first <= P[j].first )
            cnt[i][j]++, cnt[j][i]++;
    }}}

    ans = INF;
    for( int i = 1; i <= N; i++ ){
    for( int j = i + 1; j <= N; j++ ){

        for( int x = 0; x <= K; x++ )
            under[x] = over[x] = INF;

        for( int k = 1; k <= N; k++ ){
            int pcts = get_nr( i, j, k );
            if( det( i, j, k ) > 0 )
                over[pcts] = min( over[pcts], det(i, j, k) );
            else
                under[pcts] = min( under[pcts], -det(i, j, k) );
        }

        for( int x = K - 1; x >= 0; x-- ){
            over[x] = min( over[x], over[x + 1] );
            under[x] = min( under[x], under[x + 1] );
        }

        for( int x = 0; x <= K; x++ )
            if( under[x] != INF && over[K - x] != INF )
            ans = min( ans, under[x] + over[K - x] );
    }}

    fout << ans / 2  << "." << ( (ans % 2 == 1) ? 5 : 0 ) << endl;
    return 0;
}