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

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
using namespace std;
using ll = long long;
using ld = long double;
using V = vector<int>;
using Vll = vector<ll>;
using Vld = vector<ld>;
using Vbo = vector<bool>;
using VV = vector<V>;
using VVll = vector<Vll>;
using VVld = vector<Vld>;
using VVbo = vector<Vbo>;
using VVV = vector<VV>;
using VVVll = vector<VVll>;
using P = pair<int, int>;
using Pll = pair<ll, ll>;
using Pld = pair<ld, ld>;
#define rep2(i, m, n) for (int i = (m); i < (n); ++i)
#define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i)
#define rep(i, n) rep2(i, 0, n)
#define drep(i, n) drep2(i, n, 0)
#define all(a) (a).begin(), (a).end()
struct fast_ios {
  fast_ios() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
template <typename T> inline int sz(T &x) { return x.size(); }
template <typename T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << '(' << p.first << ", " << p.second << ')';
  return os;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &e : v)
    is >> e;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto &e : v)
    os << e << '\\n';
  return os;
}
template <typename T> inline int count_between(vector<T> &a, T l, T r) {
  return lower_bound(all(a), r) - lower_bound(all(a), l);
} // [l, r)
inline int fLog2(const int x) {
  assert(x > 0);
  return 31 - __builtin_clz(x);
} // floor(log2(x))
inline int fLog2(const ll x) {
  assert(x > 0);
  return 63 - __builtin_clzll(x);
}
inline int cLog2(const int x) {
  assert(x > 0);
  return (x == 1) ? 0 : 32 - __builtin_clz(x - 1);
} // ceil(log2(x))
inline int cLog2(const ll x) {
  assert(x > 0);
  return (x == 1) ? 0 : 64 - __builtin_clzll(x - 1);
}
inline int popcount(const int x) { return __builtin_popcount(x); }
inline int popcount(const ll x) { return __builtin_popcountll(x); }
const int INF = 1 << 30;
const ll INFll = 1ll << 62;
const ld EPS = 1e-10;
const ld PI = acos(-1.0);
// const int MOD  = int(1e9)+7;
// const int MOD  = 998244353;

int main() {
  int n;
  cin >> n;
  V x(n), y(n);
  Vll p(n);
  rep(i, n) cin >> x[i] >> y[i] >> p[i];

  int N = 1 << n;
  VV xdst(n, V(N));
  VV ydst(n, V(N));

  rep(S, N) {
    VV rx(n, V(n + 1, INF));
    VV ry(n, V(n + 1, INF));
    rep(i, n) if (S >> i & 1) {
      rep(j, n) rx[j][i] = abs(x[i] - x[j]);
      rep(j, n) ry[j][i] = abs(y[i] - y[j]);
    }
    rep(i, n) {
      rx[i][n] = abs(x[i]);
      ry[i][n] = abs(y[i]);
    }
    rep(i, n) xdst[i][S] = *min_element(all(rx[i]));
    rep(i, n) ydst[i][S] = *min_element(all(ry[i]));
  }

  Vll ans(n + 1, INFll);

  rep(S, N) drep(T, S + 1) {
    T &= S;
    int U = S ^ T;
    ll res = 0;
    rep(i, n) res += p[i] * min(xdst[i][T], ydst[i][U]);
    int k = popcount(S);
    chmin(ans[k], res);
  }

  cout << ans;
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
using namespace std;
using ll = long long;
using ld = long double;
using V = vector<int>;
using Vll = vector<ll>;
using Vld = vector<ld>;
using Vbo = vector<bool>;
using VV = vector<V>;
using VVll = vector<Vll>;
using VVld = vector<Vld>;
using VVbo = vector<Vbo>;
using VVV = vector<VV>;
using VVVll = vector<VVll>;
using P = pair<int, int>;
using Pll = pair<ll, ll>;
using Pld = pair<ld, ld>;
#define rep2(i, m, n) for (int i = (m); i < (n); ++i)
#define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i)
#define rep(i, n) rep2(i, 0, n)
#define drep(i, n) drep2(i, n, 0)
#define all(a) (a).begin(), (a).end()
struct fast_ios {
  fast_ios() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
template <typename T> inline int sz(T &x) { return x.size(); }
template <typename T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << '(' << p.first << ", " << p.second << ')';
  return os;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &e : v)
    is >> e;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto &e : v)
    os << e << '\\n';
  return os;
}
template <typename T> inline int count_between(vector<T> &a, T l, T r) {
  return lower_bound(all(a), r) - lower_bound(all(a), l);
} // [l, r)
inline int fLog2(const int x) {
  assert(x > 0);
  return 31 - __builtin_clz(x);
} // floor(log2(x))
inline int fLog2(const ll x) {
  assert(x > 0);
  return 63 - __builtin_clzll(x);
}
inline int cLog2(const int x) {
  assert(x > 0);
  return (x == 1) ? 0 : 32 - __builtin_clz(x - 1);
} // ceil(log2(x))
inline int cLog2(const ll x) {
  assert(x > 0);
  return (x == 1) ? 0 : 64 - __builtin_clzll(x - 1);
}
inline int popcount(const int x) { return __builtin_popcount(x); }
inline int popcount(const ll x) { return __builtin_popcountll(x); }
const int INF = 1 << 30;
const ll INFll = 1ll << 62;
const ld EPS = 1e-10;
const ld PI = acos(-1.0);
// const int MOD  = int(1e9)+7;
// const int MOD  = 998244353;

int main() {
  int n;
  cin >> n;
  V x(n), y(n);
  Vll p(n);
  rep(i, n) cin >> x[i] >> y[i] >> p[i];

  int N = 1 << n;
  Vll ans(n + 1, INFll);

  rep(S, N) {
    drep(T, S + 1) {
      T &= S;
      int U = S ^ T;
      int kx = popcount(T);
      int ky = popcount(U);

      VV rx(n, V(n + 1, INF));
      VV ry(n, V(n + 1, INF));
      rep(i, n) {
        if (T >> i & 1)
          rep(j, n) rx[j][i] = abs(x[i] - x[j]);
        if (U >> i & 1)
          rep(j, n) ry[j][i] = abs(y[i] - y[j]);
      }
      rep(i, n) {
        rx[i][n] = abs(x[i]);
        ry[i][n] = abs(y[i]);
      }

      ll res = 0;
      rep(i, n) res +=
          p[i] * min(*min_element(all(rx[i])), *min_element(all(ry[i])));
      chmin(ans[kx + ky], res);
    }
  }

  cout << ans;
  return 0;
}