Problem p02764 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using namespace std;

struct point {
  double x, y;
};
int n, k, EPS = 1000;
double l = 0, ri = 1E10;
vector<point> p;
vector<double> c;

double len(point a, point b) { return hypot((a.x - b.x), (a.y - b.y)); }

bool yet_ok(double t) {
  if (n == 1)
    return true;

  vector<double> r(n);

  for (int i = 0; i < n; i++)
    r[i] = t / c[i];

  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      if (len(p[i], p[j]) > r[i] + r[j])
        continue;

      if (len(p[i], p[j]) < fabs(r[i] - r[j]))
        continue;

      double a1 = -2 * (p[i].x - p[j].x);
      double b1 = -2 * (p[i].y - p[j].y);
      double c1 = p[i].x * p[i].x - p[j].x * p[j].x + p[i].y * p[i].y -
                  p[j].y * p[j].y - r[i] * r[i] + r[j] * r[j];

      point o;
      int cnt = 0;

      double d1 = len({0, 0}, {a1, b1});
      a1 /= d1;
      b1 /= d1;
      c1 /= d1;

      d1 = a1 * p[i].x + b1 * p[i].y + c1;

      o = {p[i].x - a1 * d1, p[i].y - b1 * d1};
      double move = sqrt(r[i] * r[i] - d1 * d1);

      vector<point> all_dots = {{o.x + b1 * move, o.y - a1 * move},
                                {o.x - b1 * move, o.y + a1 * move}};

      for (auto v : all_dots) {
        cnt = 0;
        o = v;
        for (int q = 0; q < n; q++)
          if (len(p[q], o) <= r[q] || q == i || q == j)
            cnt++;

        if (cnt >= k)
          return true;
      }
    }

  for (auto o : p) {
    int cnt = 0;
    for (int q = 0; q < n; q++)
      if (len(p[q], o) <= r[q])
        cnt++;

    if (cnt >= k)
      return true;
  }

  return false;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  cin >> n >> k;

  p.resize(n);
  c.resize(n);

  for (int i = 0; i < n; i++)
    cin >> p[i].x >> p[i].y >> c[i];

  for (int it = 0; it < EPS; it++) {
    double m = (l + ri) / 2;

    if (yet_ok(m))
      ri = m;
    else
      l = m;
  }

  cout << fixed << setprecision(20);
  cout << ri << "\n";

  return 0;
}


Fixed submission:
#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using namespace std;

struct point {
  double x, y;
};
int n, k, EPS = 100;
double l = 0, ri = 1E10;
vector<point> p;
vector<double> c;

double len(point a, point b) { return hypot((a.x - b.x), (a.y - b.y)); }

bool yet_ok(double t) {
  if (n == 1)
    return true;

  vector<double> r(n);

  for (int i = 0; i < n; i++)
    r[i] = t / c[i];

  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      if (len(p[i], p[j]) > r[i] + r[j])
        continue;

      if (len(p[i], p[j]) < fabs(r[i] - r[j]))
        continue;

      double a1 = -2 * (p[i].x - p[j].x);
      double b1 = -2 * (p[i].y - p[j].y);
      double c1 = p[i].x * p[i].x - p[j].x * p[j].x + p[i].y * p[i].y -
                  p[j].y * p[j].y - r[i] * r[i] + r[j] * r[j];

      point o;
      int cnt = 0;

      double d1 = len({0, 0}, {a1, b1});
      a1 /= d1;
      b1 /= d1;
      c1 /= d1;

      d1 = a1 * p[i].x + b1 * p[i].y + c1;

      o = {p[i].x - a1 * d1, p[i].y - b1 * d1};
      double move = sqrt(r[i] * r[i] - d1 * d1);

      vector<point> all_dots = {{o.x + b1 * move, o.y - a1 * move},
                                {o.x - b1 * move, o.y + a1 * move}};

      for (auto v : all_dots) {
        cnt = 0;
        o = v;
        for (int q = 0; q < n; q++)
          if (len(p[q], o) <= r[q] || q == i || q == j)
            cnt++;

        if (cnt >= k)
          return true;
      }
    }

  for (auto o : p) {
    int cnt = 0;
    for (int q = 0; q < n; q++)
      if (len(p[q], o) <= r[q])
        cnt++;

    if (cnt >= k)
      return true;
  }

  return false;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  cin >> n >> k;

  p.resize(n);
  c.resize(n);

  for (int i = 0; i < n; i++)
    cin >> p[i].x >> p[i].y >> c[i];

  for (int it = 0; it < EPS; it++) {
    double m = (l + ri) / 2;

    if (yet_ok(m))
      ri = m;
    else
      l = m;
  }

  cout << fixed << setprecision(20);
  cout << ri << "\n";

  return 0;
}