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

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cfloat>
#include <chrono>
#include <climits>
#include <cmath>
#include <cstdio>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

template <class T1, class T2>
ostream &operator<<(ostream &out, const pair<T1, T2> p) {
  out << '(' << p.first << ',' << p.second << ')';
  return out;
}

template <class T1, class T2>
istream &operator>>(istream &in, pair<T1, T2> &p) {
  in >> p.first >> p.second;
  return in;
}

template <class T> istream &operator>>(istream &in, vector<T> &v) {
  for (T &x : v)
    in >> x;
  return in;
}

template <class T>
ostream &operator<<(ostream &out, const vector<vector<T>> &v) {
  for (const vector<T> &x : v)
    out << x << '\\n';
  return out;
}

template <class T> ostream &operator<<(ostream &out, const vector<T> &v) {
  for (const T &x : v)
    out << x << ' ';
  return out;
}

long long gcd(long long a, long long b) {
  if (b > a)
    swap(a, b);
  return (b ? gcd(b, a % b) : a);
}

using ll = long long;
using pii = pair<int, int>;
using pll = pair<long long, long long>;
using tiii = pair<pair<int, int>, int>;
using vi = vector<int>;
using vl = vector<long long>;
using vvi = vector<vector<int>>;
using vvl = vector<vector<long long>>;

#define F first
#define S second
#define First first.first
#define Second first.second
#define Third second
#define mp make_pair
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define per(i, b, a) for (int i = (b); i > (a); i--)
#define all(x) x.begin(), x.end()
#define ret(x) return cout << x, 0;
#define throwex throw runtime_error("Found the error.");

const int h = 1000000007;

signed main() {
  ios::sync_with_stdio(false);
#ifdef ONLINE_JUDGE
  cin.tie(nullptr);
  cout.tie(nullptr);
  cerr.setstate(ios::failbit);
#endif

  int n;
  cin >> n;
  vl x(n), y(n), p(n);
  rep(i, 0, n) cin >> x[i] >> y[i] >> p[i];
  int max_iter = 1;
  rep(i, 0, n) max_iter *= 3;
  vl default_dp(n);
  rep(i, 0, n) default_dp[i] = min(abs(x[i]), abs(y[i]));
  vvl dpx((1 << n), default_dp), dpy((1 << n), default_dp);
  rep(i, 0, (1 << n)) rep(j, 0, n) rep(k, 0, n) if ((i >> k) & 1) {
    dpx[i][j] = min(dpx[i][j], abs(x[j] - x[k]));
    dpy[i][j] = min(dpy[i][j], abs(y[j] - y[k]));
  }
  vl ans(n + 1, LLONG_MAX);
  rep(i, 0, max_iter) {
    int c = 0, sb = 0;
    int mask = i;
    int dpx_mask = 0, dpy_mask = 0;
    while (mask) {
      int z = mask % 3;
      if (z == 1)
        dpx_mask += (1 << c), sb++;
      else if (z == 2)
        dpy_mask += (1 << c), sb++;
      mask /= 3;
      c++;
    }
    vl vals(n);
    rep(i, 0, n) vals[i] = min(dpx[dpx_mask][i], dpy[dpy_mask][i]);
    rep(i, 0, n) vals[i] *= p[i];
    ans[sb] = min(ans[sb], accumulate(all(vals), 0LL));
  }
  for (ll x : ans)
    cout << x << '\\n';
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cfloat>
#include <chrono>
#include <climits>
#include <cmath>
#include <cstdio>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

template <class T1, class T2>
ostream &operator<<(ostream &out, const pair<T1, T2> p) {
  out << '(' << p.first << ',' << p.second << ')';
  return out;
}

template <class T1, class T2>
istream &operator>>(istream &in, pair<T1, T2> &p) {
  in >> p.first >> p.second;
  return in;
}

template <class T> istream &operator>>(istream &in, vector<T> &v) {
  for (T &x : v)
    in >> x;
  return in;
}

template <class T>
ostream &operator<<(ostream &out, const vector<vector<T>> &v) {
  for (const vector<T> &x : v)
    out << x << '\\n';
  return out;
}

template <class T> ostream &operator<<(ostream &out, const vector<T> &v) {
  for (const T &x : v)
    out << x << ' ';
  return out;
}

long long gcd(long long a, long long b) {
  if (b > a)
    swap(a, b);
  return (b ? gcd(b, a % b) : a);
}

using ll = long long;
using pii = pair<int, int>;
using pll = pair<long long, long long>;
using tiii = pair<pair<int, int>, int>;
using vi = vector<int>;
using vl = vector<long long>;
using vvi = vector<vector<int>>;
using vvl = vector<vector<long long>>;

#define F first
#define S second
#define First first.first
#define Second first.second
#define Third second
#define mp make_pair
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define per(i, b, a) for (int i = (b); i > (a); i--)
#define all(x) x.begin(), x.end()
#define ret(x) return cout << x, 0;
#define throwex throw runtime_error("Found the error.");

const int h = 1000000007;

signed main() {
  ios::sync_with_stdio(false);
#ifdef ONLINE_JUDGE
  cin.tie(nullptr);
  cout.tie(nullptr);
  cerr.setstate(ios::failbit);
#endif

  int n;
  cin >> n;
  vl x(n), y(n), p(n);
  rep(i, 0, n) cin >> x[i] >> y[i] >> p[i];
  int max_iter = 1;
  rep(i, 0, n) max_iter *= 3;
  vi xs(n), ys(n);
  iota(all(xs), 0);
  iota(all(ys), 0);
  sort(all(xs), [&x](int a, int b) { return x[a] < x[b]; });
  sort(all(ys), [&y](int a, int b) { return y[a] < y[b]; });
  vl ans(n + 1, LLONG_MAX);
  rep(i, 0, max_iter) {
    vi vert, horz;
    vert.push_back(0);
    horz.push_back(0);
    int c = 0, sb = 0;
    int mask = i;
    while (mask) {
      int z = mask % 3;
      if (z == 1)
        vert.push_back(x[c]), sb++;
      else if (z == 2)
        horz.push_back(y[c]), sb++;
      mask /= 3;
      c++;
    }
    sort(all(vert));
    sort(all(horz));
    vl vals(n, LLONG_MAX);
    int z = 0;
    rep(i, 0, n) {
      while (z != vert.size() and vert[z] < x[xs[i]])
        z++;
      if (z == vert.size())
        break;
      vals[xs[i]] = min(vals[xs[i]], vert[z] - x[xs[i]]);
    }
    z = vert.size() - 1;
    per(i, n - 1, -1) {
      while (z != -1 and vert[z] > x[xs[i]])
        z--;
      if (z == -1)
        break;
      vals[xs[i]] = min(vals[xs[i]], x[xs[i]] - vert[z]);
    }
    z = 0;
    rep(i, 0, n) {
      while (z != horz.size() and horz[z] < y[ys[i]])
        z++;
      if (z == horz.size())
        break;
      vals[ys[i]] = min(vals[ys[i]], horz[z] - y[ys[i]]);
    }
    z = horz.size() - 1;
    per(i, n - 1, -1) {
      while (z != -1 and horz[z] > y[ys[i]])
        z--;
      if (z == -1)
        break;
      vals[ys[i]] = min(vals[ys[i]], y[ys[i]] - horz[z]);
    }
    // cerr << vals << '\\n';
    rep(i, 0, n) vals[i] *= p[i];
    ans[sb] = min(ans[sb], accumulate(all(vals), 0LL));
  }
  for (ll x : ans)
    cout << x << '\\n';
}