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

#include <bits/stdc++.h>
using namespace std;

typedef ostringstream OSS;
typedef istringstream ISS;

typedef long long LL;
typedef pair<int, int> PII;

typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<LL> VLL;
typedef vector<VLL> VVLL;
typedef vector<double> VD;
typedef vector<VD> VVD;
typedef vector<string> VS;
typedef vector<VS> VVS;
typedef vector<bool> VB;
typedef vector<VB> VVB;
typedef vector<PII> VPII;

#define fst first
#define snd second
// #define Y first
// #define X second
#define MP make_pair
#define PB push_back
#define EB emplace_back
#define ALL(x) (x).begin(), (x).end()
#define RANGE(x, y, maxX, maxY)                                                \\
  (0 <= (x) && 0 <= (y) && (x) < (maxX) && (y) < (maxY))
#define DUMP(x) cerr << #x << " = " << (x) << endl
#define rep(i, N) for (int i = 0; i < (N); i++)
#define rep2(i, j, N, M) rep(i, N) rep(j, M)
#define rep3(i, j, k, N, M, L) rep(i, N) rep(j, M) rep(k, L)
#define REP(i, init, N) for (int i = (init); i < (N); i++)

template <typename T> inline T fromString(const string &s) {
  T res;
  ISS iss(s);
  iss >> res;
  return res;
};
template <typename T> inline string toString(const T &a) {
  OSS oss;
  oss << a;
  return oss.str();
};

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const double DINF = 0x3f3f3f3f;
const int DX[] = {1, 0, -1, 0}, DY[] = {0, -1, 0, 1};

int N, M;
VD ls, as, bs;

double distance(int i, int j) {
  double l = ls[i] - ls[j];
  double a = as[i] - as[j];
  double b = bs[i] - bs[j];

  return l * l + a * a + b * b;
}

double solve() {
  double ans = 0;

  for (LL p = 0; p < 1LL << N; p++) {
    if (__builtin_popcount(p) != M)
      continue;

    double sum = 0;
    rep(i, N) REP(j, i + 1, N) {
      if (!(1 << i & p))
        continue;
      if (!(1 << j & p))
        continue;

      sum += distance(i, j);
    }
    ans = max(ans, sum);
  }

  return ans;
}

int main(void) {
  while (cin >> N >> M, N) {
    ls = VD(N);
    as = VD(N);
    bs = VD(N);
    rep(i, N) { cin >> ls[i] >> as[i] >> bs[i]; }

    printf("%.9f\\n", solve());

    return 0;
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

typedef ostringstream OSS;
typedef istringstream ISS;

typedef long long LL;
typedef pair<int, int> PII;

typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<LL> VLL;
typedef vector<VLL> VVLL;
typedef vector<double> VD;
typedef vector<VD> VVD;
typedef vector<string> VS;
typedef vector<VS> VVS;
typedef vector<bool> VB;
typedef vector<VB> VVB;
typedef vector<PII> VPII;

#define fst first
#define snd second
// #define Y first
// #define X second
#define MP make_pair
#define PB push_back
#define EB emplace_back
#define ALL(x) (x).begin(), (x).end()
#define RANGE(x, y, maxX, maxY)                                                \\
  (0 <= (x) && 0 <= (y) && (x) < (maxX) && (y) < (maxY))
#define DUMP(x) cerr << #x << " = " << (x) << endl
#define rep(i, N) for (int i = 0; i < (N); i++)
#define rep2(i, j, N, M) rep(i, N) rep(j, M)
#define rep3(i, j, k, N, M, L) rep(i, N) rep(j, M) rep(k, L)
#define REP(i, init, N) for (int i = (init); i < (N); i++)

template <typename T> inline T fromString(const string &s) {
  T res;
  ISS iss(s);
  iss >> res;
  return res;
};
template <typename T> inline string toString(const T &a) {
  OSS oss;
  oss << a;
  return oss.str();
};

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const double DINF = 0x3f3f3f3f;
const int DX[] = {1, 0, -1, 0}, DY[] = {0, -1, 0, 1};

int N, M;
VD ls, as, bs;

double distance(int i, int j) {
  double l = ls[i] - ls[j];
  double a = as[i] - as[j];
  double b = bs[i] - bs[j];

  return l * l + a * a + b * b;
}

double solve() {
  double ans = 0;

  for (LL p = 0; p < 1LL << N; p++) {
    if (__builtin_popcount(p) != M)
      continue;

    double sum = 0;
    rep(i, N) REP(j, i + 1, N) {
      if (!(1 << i & p))
        continue;
      if (!(1 << j & p))
        continue;

      sum += distance(i, j);
    }
    ans = max(ans, sum);
  }

  return ans;
}

int main(void) {
  while (cin >> N >> M, N) {
    ls = VD(N);
    as = VD(N);
    bs = VD(N);
    rep(i, N) { cin >> ls[i] >> as[i] >> bs[i]; }

    printf("%.9f\\n", solve());
  }

  return 0;
}