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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define F first
#define S second
#define pii pair<int, int>
#define pli pair<ll, int>
#define pil pair<int, ll>
#define pll pair<ll, ll>
#define eb emplace_back
#define all(v) v.begin(), v.end()
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rep3(i, l, n) for (int i = l; i < (n); ++i)
#define sz(v) (int)v.size()
#define endl '\\n'
const int inf = 1000000007;
const ll INF = 1e18;
// int mod = 998244353;
int mod = 1000000007;
#define abs(x) (x >= 0 ? x : -(x))
#define lb(v, x) (int)(lower_bound(all(v), x) - v.begin())
#define ub(v, x) (int)(upper_bound(all(v), x) - v.begin())
template <typename T1, typename T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
template <typename T, typename U> T pow_(T a, U b) {
  return b ? pow_(a * a, b / 2) * (b % 2 ? a : 1) : 1;
}
ll modpow(ll a, ll b, ll _mod) {
  return b ? modpow(a * a % _mod, b / 2, _mod) * (b % 2 ? a : 1) % _mod : 1;
}
template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << p.F << " " << p.S;
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  rep(i, sz(vec)) {
    if (i)
      os << " ";
    os << vec[i];
  }
  return os;
}
template <typename T> inline istream &operator>>(istream &is, vector<T> &v) {
  rep(j, sz(v)) is >> v[j];
  return is;
}
template <class T, class T2> inline void add(T &a, T2 b) {
  a += b % mod;
  if (a >= mod)
    a -= mod;
}
template <class T> void operator+=(vector<T> &v, vector<T> v2) {
  rep(i, sz(v2)) v.eb(v2[i]);
}

void solve();

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout << fixed << setprecision(12); // debuged
  int T;
  T = 1;
  while (T--)
    solve();
}

// https://atcoder.jp/contests/m-solutions2020/submissions/15481739
void solve() {
  int n;
  cin >> n;
  vector<int> x(n), y(n), p(n);
  rep(i, n) cin >> x[i] >> y[i] >> p[i];

  auto calc = [&](vector<int> x) {
    vector<vector<ll>> xmi(1 << n, vector<ll>(n));
    rep(i, 1 << n) {
      rep(j, n) {
        ll mi = 1LL * abs(x[j]) * p[j];
        rep(k, n) {
          if (i & (1 << k)) {
            chmin(mi, 1LL * abs(x[k] - x[j]) * p[j]);
          }
        }
        xmi[i][j] = mi;
      }
    }
    return xmi;
  };
  auto xmi = calc(x), ymi = calc(y);
  // rep(i, 1 << n) cerr << i << "  " << xmi[i] << endl;

  auto get_size = [&](vector<int> x) {
    vector<int> xsize(1 << n);
    rep(i, 1 << n) {
      set<int> s;
      rep(j, n) {
        if (i & (1 << j)) {
          s.emplace(x[j]);
        }
      }
      xsize[i] = sz(s);
    }
    return xsize;
  };
  auto xsize = get_size(x), ysize = get_size(y);

  vector<ll> ans(n + 1, INF);
  auto dfs = [&](auto &&dfs, int d, int z) -> void {
    if (d == n) {
      int x_ = 0, y_ = 0, z_ = z;
      rep(i, n) {
        if (z_ % 3 == 1) {
          x_ += 1 << i;
        } else if (z_ % 3 == 2) {
          y_ += 1 << i;
        }
        z_ /= 3;
      }
      ll sum = 0;
      rep(i, n) sum += min(xmi[x_][i], ymi[y_][i]);
      chmin(ans[xsize[x_] + ysize[y_]], sum);
      return;
    }
    dfs(dfs, d + 1, z);
    dfs(dfs, d + 1, z + pow_(3, d));
    dfs(dfs, d + 1, z + pow_(3, d) * 2);
  };
  dfs(dfs, 0, 0);
  rep3(i, 1, n + 1) chmin(
      ans[i], ans[i - 1]); // debuged, それだけ座標がない場合テキトーに敷く
  rep(i, n + 1) cout << ans[i] << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define F first
#define S second
#define pii pair<int, int>
#define pli pair<ll, int>
#define pil pair<int, ll>
#define pll pair<ll, ll>
#define eb emplace_back
#define all(v) v.begin(), v.end()
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rep3(i, l, n) for (int i = l; i < (n); ++i)
#define sz(v) (int)v.size()
#define endl '\\n'
const int inf = 1000000007;
const ll INF = 1e18;
// int mod = 998244353;
int mod = 1000000007;
#define abs(x) (x >= 0 ? x : -(x))
#define lb(v, x) (int)(lower_bound(all(v), x) - v.begin())
#define ub(v, x) (int)(upper_bound(all(v), x) - v.begin())
template <typename T1, typename T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
template <typename T, typename U> T pow_(T a, U b) {
  return b ? pow_(a * a, b / 2) * (b % 2 ? a : 1) : 1;
}
ll modpow(ll a, ll b, ll _mod) {
  return b ? modpow(a * a % _mod, b / 2, _mod) * (b % 2 ? a : 1) % _mod : 1;
}
template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << p.F << " " << p.S;
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  rep(i, sz(vec)) {
    if (i)
      os << " ";
    os << vec[i];
  }
  return os;
}
template <typename T> inline istream &operator>>(istream &is, vector<T> &v) {
  rep(j, sz(v)) is >> v[j];
  return is;
}
template <class T, class T2> inline void add(T &a, T2 b) {
  a += b % mod;
  if (a >= mod)
    a -= mod;
}
template <class T> void operator+=(vector<T> &v, vector<T> v2) {
  rep(i, sz(v2)) v.eb(v2[i]);
}

void solve();

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout << fixed << setprecision(12); // debuged
  int T;
  T = 1;
  while (T--)
    solve();
}

// https://img.atcoder.jp/m-solutions2020/editorial.pdf
// 解法1
void solve() {
  int n;
  cin >> n;
  vector<int> x(n), y(n), p(n);
  rep(i, n) cin >> x[i] >> y[i] >> p[i];

  auto calc = [&](vector<int> x) {
    vector<vector<ll>> xmi(1 << n, vector<ll>(n));
    rep(i, 1 << n) {
      rep(j, n) {
        ll mi = 1LL * abs(x[j]) * p[j];
        rep(k, n) {
          if (i & (1 << k)) {
            chmin(mi, 1LL * abs(x[k] - x[j]) * p[j]);
          }
        }
        xmi[i][j] = mi;
      }
    }
    return xmi;
  };
  auto xmi = calc(x), ymi = calc(y);
  // rep(i, 1 << n) cerr << i << "  " << xmi[i] << endl;

  vector<ll> ans(n + 1, INF);
  auto dfs = [&](auto &&dfs, int d, int z) -> void {
    if (d == n) {
      set<int> xs, ys;
      int x_ = 0, y_ = 0, z_ = z;
      rep(i, n) {
        if (z_ % 3 == 1) {
          xs.emplace(x[i]);
          x_ += 1 << i;
        } else if (z_ % 3 == 2) {
          ys.emplace(y[i]);
          y_ += 1 << i;
        }
        z_ /= 3;
      }
      ll sum = 0;
      rep(i, n) sum += min(xmi[x_][i], ymi[y_][i]);
      chmin(ans[sz(xs) + sz(ys)], sum);
      return;
    }
    dfs(dfs, d + 1, z);
    dfs(dfs, d + 1, z + pow_(3, d));
    dfs(dfs, d + 1, z + pow_(3, d) * 2);
  };
  dfs(dfs, 0, 0);
  rep(i, n + 1) cout << ans[i] << endl;
}