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

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

#define int long long
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define reps(i, n) for (int i = 1; i <= (int)(n); i++)
#define all(x) (x).begin(), (x).end()
#define uniq(x) (x).erase(unique(all(x)), (x).end())
#define bit(n) (1LL << (n))
#define cdiv(a, b) (((a)-1) / (b) + 1)
#define dump(x) cerr << #x " = " << (x) << endl
using vint = vector<int>;
using vvint = vector<vint>;
using pint = pair<int, int>;
using vpint = vector<pint>;
template <typename T>
using priority_queue_rev = priority_queue<T, vector<T>, greater<T>>;
constexpr double PI = 3.1415926535897932384626433832795028;
constexpr int DY[9] = {0, 1, 0, -1, 1, 1, -1, -1, 0};
constexpr int DX[9] = {1, 0, -1, 0, 1, -1, -1, 1, 0};
int gcd(int a, int b) {
  while (b) {
    swap(a %= b, b);
  }
  return a;
}
int lcm(int a, int b) { return a / gcd(a, b) * b; }
int sgn(int x) { return (x > 0) - (x < 0); }
template <typename T> void fin(T mes) {
  cout << mes << endl;
  exit(0);
}
template <typename T, typename U> bool chmax(T &a, const U &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T, typename U> bool chmin(T &a, const U &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &rhs) {
  os << "(" << rhs.first << ", " << rhs.second << ")";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &rhs) {
  os << "{";
  for (auto itr = rhs.begin(); itr != rhs.end(); itr++) {
    os << *itr << (next(itr) != rhs.end() ? ", " : "");
  }
  os << "}";
  return os;
}
struct setup {
  static constexpr int PREC = 20;

  setup() {
    cout << fixed << setprecision(PREC);
    cerr << fixed << setprecision(PREC);
  };
} setup;

int N;
int X[22], Y[22], P[22];
signed main() {
  cin >> N;
  rep(i, N) { cin >> X[i] >> Y[i] >> P[i]; }
  vvint ho(bit(N), vint(N)), ve(bit(N), vint(N));
  rep(i, bit(N)) {
    rep(j, N) {
      ho[i][j] = abs(X[j]), ve[i][j] = abs(Y[j]);
      rep(k, N) {
        if (!(i & bit(k))) {
          continue;
        }
        chmin(ho[i][j], abs(X[j] - X[k])), chmin(ve[i][j], abs(Y[j] - Y[k]));
      }
    }
  }
  vint xc(bit(N)), yc(bit(N));
  rep(i, bit(N)) {
    set<int> xs, ys;
    rep(j, N) {
      if (!(i & bit(j))) {
        continue;
      }
      xs.insert(X[j]), ys.insert(Y[j]);
    }
    xc[i] = xs.size(), yc[i] = ys.size();
  }
  vint ans(N + 1, LLONG_MAX);
  int th = 1;
  rep(i, N) { th *= 3; }
  rep(i, th) {
    int c = i;
    int xmask = 0, ymask = 0;
    rep(j, N) {
      if (c % 3 == 0) {
        xmask |= bit(j);
      }
      if (c % 3 == 1) {
        ymask |= bit(j);
      }
      c /= 3;
    }
    int r = 0;
    rep(j, N) { r += min(ho[xmask][j], ve[ymask][j]) * P[j]; }
    chmin(ans[xc[xmask] + yc[ymask]], r);
  }
  reps(i, N) { chmin(ans[i], ans[i - 1]); }
  rep(i, N + 1) { cout << ans[i] << endl; }
}


Error: TLE

Fixed submission:

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

#define int long long
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define reps(i, n) for (int i = 1; i <= (int)(n); i++)
#define all(x) (x).begin(), (x).end()
#define uniq(x) (x).erase(unique(all(x)), (x).end())
#define bit(n) (1LL << (n))
#define cdiv(a, b) (((a)-1) / (b) + 1)
#define dump(x) cerr << #x " = " << (x) << endl
using vint = vector<int>;
using vvint = vector<vint>;
using pint = pair<int, int>;
using vpint = vector<pint>;
template <typename T>
using priority_queue_rev = priority_queue<T, vector<T>, greater<T>>;
constexpr double PI = 3.1415926535897932384626433832795028;
constexpr int DY[9] = {0, 1, 0, -1, 1, 1, -1, -1, 0};
constexpr int DX[9] = {1, 0, -1, 0, 1, -1, -1, 1, 0};
int gcd(int a, int b) {
  while (b) {
    swap(a %= b, b);
  }
  return a;
}
int lcm(int a, int b) { return a / gcd(a, b) * b; }
int sgn(int x) { return (x > 0) - (x < 0); }
template <typename T> void fin(T mes) {
  cout << mes << endl;
  exit(0);
}
template <typename T, typename U> bool chmax(T &a, const U &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T, typename U> bool chmin(T &a, const U &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &rhs) {
  os << "(" << rhs.first << ", " << rhs.second << ")";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &rhs) {
  os << "{";
  for (auto itr = rhs.begin(); itr != rhs.end(); itr++) {
    os << *itr << (next(itr) != rhs.end() ? ", " : "");
  }
  os << "}";
  return os;
}
struct setup {
  static constexpr int PREC = 20;

  setup() {
    cout << fixed << setprecision(PREC);
    cerr << fixed << setprecision(PREC);
  };
} setup;

int N;
int X[22], Y[22], P[22];
signed main() {
  cin >> N;
  rep(i, N) { cin >> X[i] >> Y[i] >> P[i]; }
  vvint ho(bit(N), vint(N)), ve(bit(N), vint(N));
  rep(i, bit(N)) {
    rep(j, N) {
      ho[i][j] = abs(X[j]), ve[i][j] = abs(Y[j]);
      rep(k, N) {
        if (!(i & bit(k))) {
          continue;
        }
        chmin(ho[i][j], abs(X[j] - X[k])), chmin(ve[i][j], abs(Y[j] - Y[k]));
      }
    }
  }
  vint ans(N + 1, LLONG_MAX);
  int th = 1;
  rep(i, N) { th *= 3; }
  rep(i, th) {
    int c = i;
    unordered_set<int> xs, ys;
    int xmask = 0, ymask = 0;
    rep(j, N) {
      if (c % 3 == 0) {
        xs.insert(X[j]), xmask |= bit(j);
      }
      if (c % 3 == 1) {
        ys.insert(Y[j]), ymask |= bit(j);
      }
      c /= 3;
    }
    int r = 0;
    rep(j, N) { r += min(ho[xmask][j], ve[ymask][j]) * P[j]; }
    chmin(ans[xs.size() + ys.size()], r);
  }
  reps(i, N) { chmin(ans[i], ans[i - 1]); }
  rep(i, N + 1) { cout << ans[i] << endl; }
}