Submission #1300077

#TimeUsernameProblemLanguageResultExecution timeMemory
1300077mioBalloons (CEOI11_bal)C++20
100 / 100
144 ms6632 KiB
#include <cassert>
#include <iomanip>
#include <ios>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
using ld = long double;
// 1/a * (x - b)^2
struct Quad {
  ld a;
  uint b;
  ld eval(uint x) const {
    assert(x >= b);
    ld dst = x - b;
    return (dst * dst) / a;
  }
};
struct Bal {
  uint x, r;
};
constexpr uint maxx = 1e9;

uint find_intersect(const Quad &q, const map<uint, Quad> &quads) {
  if (quads.lower_bound(q.b) == quads.end())
    return maxx;
  uint s = q.b, e = maxx;
  while (s < e) {
    const uint mid = (s + e + 1) / 2;
    const map<uint, Quad>::const_iterator competitor_it =
        quads.lower_bound(mid);
    assert(competitor_it != quads.end());
    Quad competitior = competitor_it->second;
    if (q.eval(mid) < competitior.eval(mid)) {
      s = mid;
    } else {
      e = mid - 1;
    }
  }
  return s;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  uint n;
  cin >> n;
  vector<Bal> baloons(n);
  for (uint i = 0; i < n; i++) {
    cin >> baloons[i].x >> baloons[i].r;
  }
  map<uint, Quad> quads;
  vector<ld> rs(n);
  for (uint i = 0; i < n; i++) {
    Bal bal = baloons[i];
    const map<uint, Quad>::const_iterator it = quads.lower_bound(bal.x);
    rs[i] =
        (it != quads.end() ? min(it->second.eval(bal.x), (ld)bal.r) : bal.r);
    Quad q(4 * rs[i], bal.x);
    uint intersect = find_intersect(q, quads);
    quads[intersect] = q;
    quads.erase(quads.begin(), quads.find(intersect));
  }
  cout << fixed << setprecision(3);
  for (ld r : rs) {
    cout << r << '\n';
  }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...