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

// #include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

#include "boost/multiprecision/cpp_dec_float.hpp"
#include "boost/multiprecision/cpp_int.hpp"
namespace mp = boost::multiprecision;
typedef mp::cpp_int LL;
typedef mp::number<mp::cpp_dec_float<1024>>
    DD; // 仮数部が1024ビットの浮動小数点数型(TLEしたら小さくする)

typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2
ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define rrep(i, r, l) for (ll i = r; i >= l; i--)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define fi first
#define se second
#define endl                                                                   \\
  "\\n" // インタラクティブで消す！！！！！！！！！！！！！！！！！！！！！
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
template <class T, class S> inline bool chmax(T &a, S b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T, class S> inline bool chmin(T &a, S b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

void mod_print(ll k) {
  ll P = 50000;
  rep(y, 1, P) {
    ll x = mod(y * k);

    if (abs(x) <= P || x + P >= i_7) {
      if (x + P >= i_7) {
        x -= i_7;
      }
      cout << x << "/" << y << endl;
      // cout<<setprecision(5)<<(dd)x/(dd)y;
      return;
    }
  }
  cout << "nun" << endl;
}
#define all(c) c.begin(), c.end()
typedef vector<ll> vl;
//////////////////////////

#define N 16
ll n;

void cal(vector<ll> dpx[], ll x[], ll p[]) {
  rep(i, 0, (1 << n) - 1) rep(j, 0, n) dpx[i][j] = inf;

  ll dp[1 << n][n];
  rep(i, 0, (1 << n) - 1) {
    vector<ll> v;
    v.pb(0);
    rep(j, 0, n - 1) {
      if ((i >> j) & 1)
        v.pb(x[j]);
    }
    rep(j, 0, n - 1) dp[i][j] = inf;
    for (auto k : v) {
      rep(j, 0, n - 1) { chmin(dp[i][j], p[j] * abs(x[j] - k)); }
    }
  }
  /*
  rep(i,0,(1<<n)-1){
      rep(j,0,n-1)cout<<dp[i][j]<<" ";
      cout<<endl;
  }cout<<endl;*/

  for (int S = 0; S < (1 << n); S++) {
    for (int T = S; T > 0; T = (T - 1) & S) {
      ll Cnt = 0;
      ll sum = 0;
      rep(j, 0, n - 1) {
        if ((S >> j) & 1) {
          sum += dp[T][j];
          if ((T >> j) & 1) {
            Cnt++;
          }
        }
      }
      chmin(dpx[S][Cnt], sum);
    }
    ll sum = 0;
    rep(i, 0, n - 1) {
      if ((S >> i) & 1) {
        sum += abs(x[i]) * p[i];
      }
    }
    dpx[S][0] = sum;
    rep(j, 1, n) { chmin(dpx[S][j], dpx[S][j - 1]); }
  }
}
#define N 16
ll x[N], y[N], p[N];
bool compx(ll i, ll j) { return x[i] < x[j]; }
bool compy(ll i, ll j) { return y[i] < y[j]; }
int main() {
  fastio cin >> n;
  ll x[n], y[n], p[n];
  rep(i, 0, n - 1) cin >> x[i] >> y[i] >> p[i];

  vector<ll> dpx[1 << N];
  vector<ll> dpy[1 << N];
  rep(i, 0, (1 << N) - 1) {
    dpx[i].resize(n + 1);
    dpy[i].resize(n + 1);
  }
  cal(dpx, x, p);
  cal(dpy, y, p);

  /*
  rep(i,0,(1<<n)-1){
      rep(j,0,n){
          cout<<dpx[i][j]<<" ";
      }cout<<endl;
  }cout<<endl;
  rep(i,0,(1<<n)-1){
      rep(j,0,n){
          cout<<dpy[i][j]<<" ";
      }cout<<endl;
  }
  */

  ll ans[n + 1];
  rep(i, 0, n) ans[i] = inf;
  rep(xi, 0, (1 << n) - 1) {
    ll yi = (1 << n) - 1 - xi;
    rep(xc, 0, n) {
      rep(yc, 0, n) {
        if (xc + yc > n)
          continue;
        chmin(ans[xc + yc], dpx[xi][xc] + dpy[yi][yc]);
      }
    }
  }
  rep(i, 0, n) cout << ans[i] << endl;

  return 0;
}


Error: TLE

Fixed submission:


// #include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

#include "boost/multiprecision/cpp_dec_float.hpp"
#include "boost/multiprecision/cpp_int.hpp"
namespace mp = boost::multiprecision;
typedef mp::cpp_int LL;
typedef mp::number<mp::cpp_dec_float<1024>>
    DD; // 仮数部が1024ビットの浮動小数点数型(TLEしたら小さくする)

typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2
ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define rrep(i, r, l) for (ll i = r; i >= l; i--)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define fi first
#define se second
#define endl                                                                   \\
  "\\n" // インタラクティブで消す！！！！！！！！！！！！！！！！！！！！！
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
template <class T, class S> inline bool chmax(T &a, S b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T, class S> inline bool chmin(T &a, S b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

void mod_print(ll k) {
  ll P = 50000;
  rep(y, 1, P) {
    ll x = mod(y * k);

    if (abs(x) <= P || x + P >= i_7) {
      if (x + P >= i_7) {
        x -= i_7;
      }
      cout << x << "/" << y << endl;
      // cout<<setprecision(5)<<(dd)x/(dd)y;
      return;
    }
  }
  cout << "nun" << endl;
}
#define all(c) c.begin(), c.end()
typedef vector<ll> vl;
//////////////////////////

#define N 16
ll n;

void cal(vector<ll> dpx[], ll x[], ll p[]) {
  rep(i, 0, (1 << n) - 1) rep(j, 0, n) dpx[i][j] = inf;
  for (int S = 0; S < (1 << n); S++) {

    for (int T = S; T > 0; T = (T - 1) & S) {
      // cout<<T<<" ";
      vector<l_l> a;
      vector<ll> v;
      v.pb(0);
      ll Cnt = 0;
      rep(i, 0, n - 1) {
        if (((S >> i) & 1) == 0)
          continue;
        if ((T >> i) & 1) {
          v.pb(x[i]);
          Cnt++;
        } else {
          a.pb({x[i], p[i]});
        }
      }
      SORT(v);
      ll sum = 0;
      ll vs = v.size();
      for (auto t : a) {
        ll pos = POSL(v, t.fi);
        ll ad = inf;
        rep(po, pos - 1, pos + 1) {
          if (po < 0)
            continue;
          if (po >= vs)
            continue;
          chmin(ad, abs(t.fi - v[po]) * t.se);
        }
        sum += ad;
      }
      chmin(dpx[S][Cnt], sum);
    }
    ll sum = 0;
    rep(i, 0, n - 1) {
      if ((S >> i) & 1) {
        sum += abs(x[i]) * p[i];
      }
    }
    dpx[S][0] = sum;
    rep(j, 1, n) { chmin(dpx[S][j], dpx[S][j - 1]); }
  }
}

int main() {
  fastio cin >> n;
  ll x[n], y[n], p[n];
  rep(i, 0, n - 1) cin >> x[i] >> y[i] >> p[i];

  vector<ll> dpx[1 << N];
  vector<ll> dpy[1 << N];
  rep(i, 0, (1 << N) - 1) {
    dpx[i].resize(n + 1);
    dpy[i].resize(n + 1);
  }
  cal(dpx, x, p);
  cal(dpy, y, p);
  /*
  rep(i,0,(1<<n)-1){
      rep(j,0,n){
          cout<<dpx[i][j]<<" ";
      }cout<<endl;
  }cout<<endl;
  rep(i,0,(1<<n)-1){
      rep(j,0,n){
          cout<<dpy[i][j]<<" ";
      }cout<<endl;
  }
  */

  ll ans[n + 1];
  rep(i, 0, n) ans[i] = inf;
  rep(xi, 0, (1 << n) - 1) {
    ll yi = (1 << n) - 1 - xi;
    rep(xc, 0, n) {
      rep(yc, 0, n) {
        if (xc + yc > n)
          continue;
        chmin(ans[xc + yc], dpx[xi][xc] + dpy[yi][yc]);
      }
    }
  }
  rep(i, 0, n) cout << ans[i] << endl;

  return 0;
}