Problem p00910 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = a; i < b; i++)

const double EPS = 1e-9;
const double INF = 1e12;

struct P {
  double x, y, z;
  P() {}
  P(double x, double y, double z) : x(x), y(y), z(z) {}
};
P operator+(P a, P b) { return P(a.x + b.x, a.y + b.y, a.z + b.z); }
P operator-(P a, P b) { return P(a.x - b.x, a.y - b.y, a.z - b.z); }
P operator*(double a, P b) { return P(a * b.x, a * b.y, a * b.z); }

double dot(P a, P b) { return a.x * b.x + a.y * b.y + a.z * b.z; }

double abs(P a) { return sqrt(dot(a, a)); }

double norm(P a) { return dot(a, a); }

struct L : public vector<P> {
  L() {}
  L(const P &a, const P &b) {
    push_back(a);
    push_back(b);
  }
};

typedef vector<P> G;

struct C {
  P p;
  double r;
  C() {}
  C(const P &p, double r) : p(p), r(r) {}
};

P projection(const L &l, const P &p) {
  double t = dot(p - l[0], l[0] - l[1]) / norm(l[0] - l[1]);
  return l[0] + t * (l[0] - l[1]);
}

bool intersectSP(const L &s, const P &p) {
  return abs(s[0] - p) + abs(s[1] - p) - abs(s[1] - s[0]) <
         EPS; // triangle inequality
}

double distanceSP(const L &s, const P &p) {
  const P r = projection(s, p);
  if (intersectSP(s, r))
    return abs(r - p);
  return min(abs(s[0] - p), abs(s[1] - p));
}

bool intersectCS(C c, L s) {
  P a = s[0], b = s[0] + s[1];
  bool ain = abs(a - c.p) < c.r - EPS, bin = abs(b - c.p) < c.r - EPS;
  if (ain && bin)
    return false;
  if (ain + bin == 1)
    return true;
  return distanceSP(s, c.p) < c.r + EPS;
}

bool intersect(const C &s, const L &l) {
  P a = l[0] - s.p, b = l[1] - s.p, c = projection(l, s.p) - s.p;
  if (abs(a) < s.r - EPS and abs(b) < s.r - EPS and abs(c) < s.r - EPS)
    return 0; // contain
  if (abs(c) > s.r + EPS)
    return 0; // far
  if (abs(a) < s.r - EPS or abs(b) < s.r - EPS)
    return 1; // intersect
  if (abs(a - c) + abs(b - c) < abs(a - b) + EPS)
    return 1; // intersect
  return 0;
}

int N, M, R;
C S[2010];
P T[15];
int TB[15];
P E;

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

  while (cin >> N >> M >> R) {
    if (N == 0)
      return 0;

    rep(i, 0, N) {
      double x, y, z, r;
      cin >> x >> y >> z >> r;
      S[i] = C(P(x, y, z), r);
    }

    rep(i, 0, M) {
      double x, y, z;
      cin >> x >> y >> z >> TB[i];
      T[i] = P(x, y, z);
    }

    {
      double x, y, z;
      cin >> x >> y >> z;
      E = P(x, y, z);
    }

    vector<int> crossed[15];
    rep(i, 0, M) {
      rep(j, 0, N) {
        if (intersect(S[j], L(E, T[i])))
          crossed[i].push_back(j);
      }
    }

    /*rep(i, 0, M)
    {
            printf("%d -> %d : ", i, cnt[i].size());
            for (auto p : cnt[i]) printf("%d ", p);
            printf("\\n");
    }*/

    double ans = 0;
    rep(i, 0, 1 << M) {
      bool done[2020];
      rep(j, 0, N) done[j] = false;

      double score = 0;
      int cnt = 0;
      rep(j, 0, M) if (i & (1 << j)) {
        for (int p : crossed[j])
          if (!done[p]) {
            done[p] = true;
            cnt++;
          }
        double down = abs(E - T[j]) * abs(E - T[j]);
        score += (double)TB[j] / down;
      }
      if (cnt <= R)
        ans = max(ans, score);
    }
    printf("%.10f\\n", ans);
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = a; i < b; i++)

const double EPS = 1e-8;
const double INF = 1e12;

struct P {
  double x, y, z;
  P() {}
  P(double x, double y, double z) : x(x), y(y), z(z) {}
};
P operator+(P a, P b) { return P(a.x + b.x, a.y + b.y, a.z + b.z); }
P operator-(P a, P b) { return P(a.x - b.x, a.y - b.y, a.z - b.z); }
P operator*(double a, P b) { return P(a * b.x, a * b.y, a * b.z); }

double dot(P a, P b) { return a.x * b.x + a.y * b.y + a.z * b.z; }

double abs(P a) { return sqrt(dot(a, a)); }

double norm(P a) { return dot(a, a); }

struct L : public vector<P> {
  L() {}
  L(const P &a, const P &b) {
    push_back(a);
    push_back(b);
  }
};

typedef vector<P> G;

struct C {
  P p;
  double r;
  C() {}
  C(const P &p, double r) : p(p), r(r) {}
};

P projection(const L &l, const P &p) {
  double t = dot(p - l[0], l[0] - l[1]) / norm(l[0] - l[1]);
  return l[0] + t * (l[0] - l[1]);
}

bool intersectSP(const L &s, const P &p) {
  return abs(s[0] - p) + abs(s[1] - p) - abs(s[1] - s[0]) <
         EPS; // triangle inequality
}

double distanceSP(const L &s, const P &p) {
  const P r = projection(s, p);
  if (intersectSP(s, r))
    return abs(r - p);
  return min(abs(s[0] - p), abs(s[1] - p));
}

bool intersectCS(C c, L s) {
  P a = s[0], b = s[0] + s[1];
  bool ain = abs(a - c.p) < c.r - EPS, bin = abs(b - c.p) < c.r - EPS;
  if (ain && bin)
    return false;
  if (ain + bin == 1)
    return true;
  return distanceSP(s, c.p) < c.r + EPS;
}

int N, M, R;
C S[2010];
P T[15];
int TB[15];
P E;

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

  while (cin >> N >> M >> R) {
    if (N == 0)
      return 0;

    rep(i, 0, N) {
      double x, y, z, r;
      cin >> x >> y >> z >> r;
      S[i] = C(P(x, y, z), r);
    }

    rep(i, 0, M) {
      double x, y, z;
      cin >> x >> y >> z >> TB[i];
      T[i] = P(x, y, z);
    }

    {
      double x, y, z;
      cin >> x >> y >> z;
      E = P(x, y, z);
    }

    set<int> cnt[15];
    rep(i, 0, M) {
      rep(j, 0, N) {
        if (intersectCS(S[j], L(E, T[i])))
          cnt[i].insert(j);
      }
    }

    /*rep(i, 0, M)
    {
            printf("%d -> %d : ", i, cnt[i].size());
            for (auto p : cnt[i]) printf("%d ", p);
            printf("\\n");
    }*/

    double ans = 0;
    rep(i, 0, 1 << M) {
      set<int> cc;
      double score = 0;
      rep(j, 0, M) if (i & (1 << j)) {
        for (auto p : cnt[j])
          cc.insert(p);
        double down = abs(E - T[j]) * abs(E - T[j]);
        score += (double)TB[j] / down;
      }
      if (cc.size() <= R)
        ans = max(ans, score);
    }
    printf("%.10f\\n", ans);
  }
}