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

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

#define rep(i, m, n) for (int(i) = (int)(m); i < (int)(n); ++i)
#define rep2(i, m, n) for (int(i) = (int)(n)-1; i >= (int)(m); --i)
#define REP(i, n) rep(i, 0, n)
#define REP2(i, n) rep2(i, 0, n)
#define all(hoge) (hoge).begin(), (hoge).end()
#define en '\\n'
using ll = long long;
using ull = unsigned long long;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;
typedef pair<ll, ll> P;
constexpr long long INF = 1LL << 60;
constexpr int INF_INT = 1 << 25;
constexpr long long MOD = (ll)1e9 + 7;
// constexpr long long MOD = 998244353LL;
using ld = long double;
static const ld pi = 3.141592653589793L;
typedef vector<ll> Array;
typedef vector<Array> Matrix;

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

// グラフ関連
struct Edge {
  ll to, cap, rev;
  Edge(ll _to, ll _cap, ll _rev) {
    to = _to;
    cap = _cap;
    rev = _rev;
  }
};
typedef vector<Edge> Edges;
typedef vector<Edges> Graph;

void add_edge(Graph &G, ll from, ll to, ll cap, bool revFlag, ll revCap) {
  G[from].push_back(Edge(to, cap, (ll)G[to].size()));
  if (revFlag)
    G[to].push_back(Edge(from, revCap, (ll)G[from].size() - 1));
}

void solve() {
  ll n;
  cin >> n;
  vec<ll> x(n), y(n), p(n);
  REP(i, n) { cin >> x[i] >> y[i] >> p[i]; }

  ll all2 = 1LL << n;
  Matrix xx(all2, Array(n, 0));
  Matrix yy(all2, Array(n, 0));
  REP(bit, all2) {
    REP(i, n) {
      xx[bit][i] = abs(x[i]);
      yy[bit][i] = abs(y[i]);
      REP(j, n) {
        if ((bit >> j) & 1) {
          chmin(xx[bit][i], abs(x[i] - x[j]));
          chmin(yy[bit][i], abs(y[i] - y[j]));
        }
      }
    }
  }

  ll all3 = 1;
  REP(i, n) { all3 *= 3; }
  Array ans(n + 1, INF);
  REP(bit, all3) {
    ll con = n;
    ll t = bit;
    ll xs = 0;
    ll ys = 0;
    REP(i, n) {
      int tt = t % 3;
      t /= 3;
      if (tt == 0) {
        con--;
      } else if (tt == 1) {
        xs |= (1LL << i);
      } else {
        ys |= (1LL << i);
      }
      // out << tt << " ";
    }
    // cout << en;

    ll sum = 0;
    REP(i, n) { sum += min(xx[xs][i], yy[ys][i]) * p[i]; }
    // cout << con << " " << sum << en;
    chmin(ans[con], sum);
  }

  for (auto i : ans)
    cout << i << en;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  /*
  ll t;
  cin >> t;
  while(t--)*/
  solve();

  return 0;
}


Error: TLE

Fixed submission:

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

#define rep(i, m, n) for (int(i) = (int)(m); i < (int)(n); ++i)
#define rep2(i, m, n) for (int(i) = (int)(n)-1; i >= (int)(m); --i)
#define REP(i, n) rep(i, 0, n)
#define REP2(i, n) rep2(i, 0, n)
#define all(hoge) (hoge).begin(), (hoge).end()
#define en '\\n'
using ll = long long;
using ull = unsigned long long;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;
typedef pair<ll, ll> P;
constexpr long long INF = 1LL << 60;
constexpr int INF_INT = 1 << 25;
constexpr long long MOD = (ll)1e9 + 7;
// constexpr long long MOD = 998244353LL;
using ld = long double;
static const ld pi = 3.141592653589793L;
typedef vector<ll> Array;
typedef vector<Array> Matrix;

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

// グラフ関連
struct Edge {
  ll to, cap, rev;
  Edge(ll _to, ll _cap, ll _rev) {
    to = _to;
    cap = _cap;
    rev = _rev;
  }
};
typedef vector<Edge> Edges;
typedef vector<Edges> Graph;

void add_edge(Graph &G, ll from, ll to, ll cap, bool revFlag, ll revCap) {
  G[from].push_back(Edge(to, cap, (ll)G[to].size()));
  if (revFlag)
    G[to].push_back(Edge(from, revCap, (ll)G[from].size() - 1));
}

void solve() {
  ll n;
  cin >> n;
  vec<ll> x(n), y(n), p(n);
  REP(i, n) { cin >> x[i] >> y[i] >> p[i]; }

  ll all = 1;
  REP(i, n) { all *= 3; }

  Array ans(n + 1, INF);

  REP(bit, all) {
    ll con = n;
    vec<ll> xs(1, 0), ys(1, 0);
    ll t = bit;
    REP(i, n) {
      int tt = t % 3;
      t /= 3;
      if (tt == 0) {
        con--;
      } else if (tt == 1) {
        xs.push_back(x[i]);
      } else {
        ys.push_back(y[i]);
      }
    }

    sort(all(xs));
    sort(all(ys));

    ll sum = 0;
    REP(i, n) {
      ll tmp = INF;
      auto it = lower_bound(all(xs), x[i]);
      if (it != xs.end())
        chmin(tmp, *it - x[i]);
      if (it != xs.begin()) {
        it--;
        chmin(tmp, x[i] - *it);
      }
      auto it2 = lower_bound(all(ys), y[i]);
      if (it2 != ys.end())
        chmin(tmp, *it2 - y[i]);
      if (it2 != ys.begin()) {
        it2--;
        chmin(tmp, y[i] - *it2);
      }
      sum += tmp * p[i];
    }
    chmin(ans[con], sum);
  }

  for (auto i : ans)
    cout << i << en;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  /*
  ll t;
  cin >> t;
  while(t--)*/
  solve();

  return 0;
}