Cod sursa(job #2010276)

Utilizator cella.florescuCella Florescu cella.florescu Data 12 august 2017 13:35:07
Problema Popandai Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 300;
const int INF = 2e9;
typedef pair <int, int> PII;

PII v[MAXN];

int sub[MAXN][MAXN];

int det(PII x, PII y, PII z) {
  return x.first * (y.second - z.second) + y.first * (z.second - x.second) + z.first * (x.second - y.second);
}

int inside(int i, int j, int k) {
  if (v[i] > v[j])
    swap(i, j);
  if (v[i] > v[k])
    swap(i, k);
  if (v[j] > v[k])
    swap(j, k);
  return abs(sub[i][k] - sub[i][j] - sub[j][k]) - 2 * (v[i].first == v[j].first) - ((det(v[i], v[k], v[j]) < 0) && v[k].first != v[j].first);
}

int splan[2][MAXN + 1];

int main()
{
    ifstream fin("popandai.in");
    ofstream fout("popandai.out");
    int n, k;
    fin >> n >> k;
    for (int i = 0; i < n; ++i)
      fin >> v[i].first >> v[i].second;
    sort(v, v + n);
    for (int i = 0; i < n - 1; ++i)
      for (int j = i + 1; j < n; ++j)
        for (int ind = 0; ind < n; ++ind)
          if ((ind ^ i) && (ind ^ j) && v[i].first <= v[ind].first && v[ind].first < v[j].first && det(v[i], v[j], v[ind]) < 0) {
            ++sub[i][j];
            ++sub[j][i];
          }
    int ans = INF;
    for (int i = 0; i < n - 1; ++i)
      for (int j = i + 1; j < n; ++j) {
        for (int ind = 0; ind <= n; ++ind)
          splan[0][ind] = splan[1][ind] = INF;
        for (int ind = 0; ind < n; ++ind)
          if ((ind ^ i) && (ind ^ j)) {
            int which = (det(v[i], v[j], v[ind]) < 0);
            int num = inside(i, j, ind);
            splan[which][num] = min(abs(det(v[i], v[j], v[ind])), splan[which][num]);
          }
        for (int ind = n - 1; ind >= 0; --ind)
          splan[0][ind] = min(splan[0][ind], splan[0][ind + 1]);
        for (int ind = 0; ind <= k; ++ind)
          if (splan[1][ind] != INF && splan[0][k - ind] != INF)
            ans = min(ans, splan[1][ind] + splan[0][k - ind]);
      }
    fout << setprecision(1) << fixed << double(ans) / 2.0;
    fin.close();
    fout.close();
    return 0;
}