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

#pragma GCC optimize("O3")
#pragma GCC target("sse4")

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

#define FOR(i, a, b) for (int i = a; i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define ins insert

template <class T> bool ckmin(T &a, const T &b) { return b < a ? a = b, 1 : 0; }
template <class T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MOD = 1000000007;
const char nl = '\\n';
const int MX = 100001; // check the limits, dummy

vector<vl> solve(vector<pair<pl, pl>> pts) {
  vector<vl> res(1 << sz(pts));
  vpl A;
  vl ans(sz(pts) + 1);
  vl cur(sz(pts));
  F0R(curSet, (1 << sz(pts))) {
    F0R(i, sz(pts)) if (curSet & (1 << i)) A.pb({pts[i].f.f, pts[i].s.f});
    F0R(i, sz(A) + 1) ans[i] = 1e18;
    FOR(i, sz(A) + 1, sz(pts) + 1) ans[i] = 0;
    F0R(m, (1 << sz(A))) {
      F0R(i, sz(A)) cur[i] = abs(A[i].f) * A[i].s;
      ll lst = -20001;
      F0R(i, sz(A)) {
        if (m & (1 << i))
          lst = A[i].f;
        ckmin(cur[i], (A[i].f - lst) * A[i].s);
      }
      lst = 20001;
      F0Rd(i, sz(A)) {
        if (m & (1 << i))
          lst = A[i].f;
        ckmin(cur[i], (lst - A[i].f) * A[i].s);
      }
      ll curRes = 0;
      F0R(i, sz(A)) curRes += cur[i];
      ckmin(ans[__builtin_popcount(m)], curRes);
    }
    int cnt = 0;
    F0R(i, sz(pts)) {
      if (curSet & (1 << i))
        cnt += 1 << pts[i].s.s;
    }
    res[cnt] = ans;
    A.clear();
  }
  return res;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  int N;
  cin >> N;
  vector<pair<pl, pl>> pts(N);
  F0R(i, N) cin >> pts[i].f.f >> pts[i].f.s >> pts[i].s.f;
  F0R(i, N) pts[i].s.s = i;
  sort(all(pts));
  vector<vl> L = solve(pts);

  F0R(i, N) swap(pts[i].f.f, pts[i].f.s);
  sort(all(pts));
  vector<vl> R = solve(pts);
  ll ans[N + 1];
  F0R(i, N + 1) ans[i] = 1e18;
  F0R(m, 1 << N) {
    F0R(i, N + 1) {
      F0R(j, N + 1) {
        if (i + j > N)
          continue;
        ckmin(ans[i + j], L[m][i] + R[(1 << N) - m - 1][j]);
        if (ans[i + j] == 13000 && i + j == 0) {
          //                    cout << "Found " << m << nl;
          //                    cout << L[m][0] << " " << R[(1<<N)-m-1][0] <<
          //                    nl;
        }
      }
    }
  }
  F0R(i, N + 1) { cout << ans[i] << nl; }
  return 0;
}

// read the question correctly (ll vs int)
// template by bqi343


Error: TLE

Fixed submission:

#pragma GCC optimize("O3")
#pragma GCC target("sse4")

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

#define FOR(i, a, b) for (int i = a; i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define ins insert

template <class T> bool ckmin(T &a, const T &b) { return b < a ? a = b, 1 : 0; }
template <class T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MOD = 1000000007;
const char nl = '\\n';
const int MX = 100001; // check the limits, dummy

vector<vl> solve(vector<pair<pl, pl>> pts) {
  vector<vl> res(1 << sz(pts));
  F0R(curSet, (1 << sz(pts))) {
    vpl A;
    F0R(i, sz(pts)) if (curSet & (1 << i)) A.pb({pts[i].f.f, pts[i].s.f});
    vl ans(sz(pts) + 1);
    F0R(i, sz(A) + 1) ans[i] = 1e18;
    FOR(i, sz(A) + 1, sz(pts) + 1) ans[i] = 0;
    F0R(m, (1 << sz(A))) {
      vl cur(sz(A));
      F0R(i, sz(A)) cur[i] = abs(A[i].f) * A[i].s;
      ll lst = -20001;
      F0R(i, sz(A)) {
        if (m & (1 << i))
          lst = A[i].f;
        ckmin(cur[i], (A[i].f - lst) * A[i].s);
      }
      lst = 20001;
      F0Rd(i, sz(A)) {
        if (m & (1 << i))
          lst = A[i].f;
        ckmin(cur[i], (lst - A[i].f) * A[i].s);
      }
      ll curRes = 0;
      F0R(i, sz(A)) curRes += cur[i];
      ckmin(ans[__builtin_popcount(m)], curRes);
    }
    int cnt = 0;
    F0R(i, sz(pts)) {
      if (curSet & (1 << i))
        cnt += 1 << pts[i].s.s;
    }
    res[cnt] = ans;
  }
  return res;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  int N;
  cin >> N;
  vector<pair<pl, pl>> pts(N);
  F0R(i, N) cin >> pts[i].f.f >> pts[i].f.s >> pts[i].s.f;
  F0R(i, N) pts[i].s.s = i;
  sort(all(pts));
  vector<vl> L = solve(pts);

  F0R(i, N) swap(pts[i].f.f, pts[i].f.s);
  sort(all(pts));
  vector<vl> R = solve(pts);
  ll ans[N + 1];
  F0R(i, N + 1) ans[i] = 1e18;
  F0R(m, 1 << N) {
    F0R(i, N + 1) {
      F0R(j, N + 1) {
        if (i + j > N)
          continue;
        ckmin(ans[i + j], L[m][i] + R[(1 << N) - m - 1][j]);
        if (ans[i + j] == 13000 && i + j == 0) {
          //                    cout << "Found " << m << nl;
          //                    cout << L[m][0] << " " << R[(1<<N)-m-1][0] <<
          //                    nl;
        }
      }
    }
  }
  F0R(i, N + 1) { cout << ans[i] << nl; }
  return 0;
}

// read the question correctly (ll vs int)
// template by bqi343