제출 #421022

#제출 시각아이디문제언어결과실행 시간메모리
421022HegdahlAliens (IOI16_aliens)C++17
0 / 100
1 ms332 KiB
#include <bits/stdc++.h>
#include "aliens.h"
#define ar array

using namespace std;
using ll = long long;
using lll = __int128;
using ld = long double;

int n, m, k;
vector<ar<ll, 2>> p;
vector<ll> l, r;
vector<int> s;

const ll INF = 1LL<<60;

ll overlap(ll l0, ll r0, ll l1, ll r1) {
  assert(l0 <= r0);
  assert(l1 <= r1);
  if (r0 < l1) return 0;
  if (r1 < l0) return 0;

  if (l0 <= l1 && r0 >= r1) return (r1-l1+1) * (r1-l1+1);
  if (l1 <= l0 && r1 >= r0) return (r0-l0+1) * (r0-l0+1);

  if (l1 >= r0) return (l1-r0+1) * (l1-r0+1);
  if (l0 >= r1) return (l0-r1+1) * (l0-r1+1);

  assert(0);
}

pair<ll, int> go(ld penalty) {
  ll real_cost = 0;
  int used = 0;
  ll cl = -INF;
  ll cr = -INF;
  
  ld tiebreak = 0;
  ld tiebreak_inc = 1.0l/n;
  for (int i : s) {
    lll was_w = cr-cl+1;
    lll extend_w = max(cr, r[i]) - min(cl, l[i]) + 1;
    lll extend_cost = extend_w*extend_w - was_w*was_w;

    lll new_w = r[i]-l[i]+1;
    lll new_cost = new_w*new_w - overlap(cl, cr, l[i], r[i]);
    
    if (extend_cost < new_cost + penalty + tiebreak) {
      real_cost += extend_cost;
      cl = min(cl, l[i]);
      cr = max(cr, r[i]);
    } else {
      if (cl > INF) cerr << cl << ':' << cr << ' ';

      real_cost += new_cost;
      cl = l[i];
      cr = r[i];
      ++used;
    }

    tiebreak += tiebreak_inc;
  }
  if (cl > INF) cerr << cl << ':' << cr << '\n';

  return {real_cost, used};
}

ll take_photos(int n_, int m_, int k_, vector<int> r_, vector<int> c_) {
  n = n_, m = m_, k = k_;
  l.resize(n);
  r.resize(n);
  s.resize(n);
  for (int i = 0; i < n; ++i) {
    l[i] = min(r_[i], c_[i]);
    r[i] = max(r_[i], c_[i]);
  }

  iota(s.begin(), s.end(), 0);
  sort(s.begin(), s.end(), [&](int i, int j) { return l[i] < l[j]; });

  ld lo = 0, hi = 1e18;
  while (hi-lo > 1e-6) {
    ld ce = (hi+lo)/2;
    auto [cost, cnt] = go(ce);
    if (cnt > k) lo = ce;
    else hi = ce;
  }
  auto [cost, cnt] = go(hi);

  return cost;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...