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

#include "bits/stdc++.h"

#define REP(i, n) for (ll i = 0; i < n; ++i)
#define RREP(i, n) for (ll i = n - 1; i >= 0; --i)
#define FOR(i, m, n) for (ll i = m; i < n; ++i)
#define RFOR(i, m, n) for (ll i = n - 1; i >= m; --i)
#define ALL(v) (v).begin(), (v).end()
#define PB(a) push_back(a)
#define UNIQUE(v) v.erase(unique(ALL(v)), v.end());
#define DUMP(v)                                                                \\
  REP(aa, (v).size()) {                                                        \\
    cout << v[aa];                                                             \\
    if (aa != v.size() - 1)                                                    \\
      cout << " ";                                                             \\
    else                                                                       \\
      cout << endl;                                                            \\
  }
#define INF 1000000001ll
#define MOD 1000000007ll
#define EPS 1e-9

const int dx[8] = {1, 1, 0, -1, -1, -1, 0, 1};
const int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll max(ll a, int b) { return max(a, ll(b)); }
ll max(int a, ll b) { return max(ll(a), b); }
ll min(ll a, int b) { return min(a, ll(b)); }
ll min(int a, ll b) { return min(ll(a), b); }
///(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)///

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

  vi v;
  FOR(i, 1, 1000001) {
    v.push_back(i * (i + 1) * (i + 2) / 6);
    if (v[i - 1] >= 1000001)
      break;
  }
  int m = v.size();
  vi dp(1000001, INF);
  dp[0] = 0;
  REP(i, m) {
    REP(j, 1000000 + 1) {
      if (j >= v[i])
        dp[j] = min(dp[j], dp[j - v[i]] + 1);
    }
  }
  vi dp2(1000001, INF);

  dp2[0] = 0;
  REP(i, m) {
    if (v[i] % 2 == 0)
      continue;

    REP(j, 1000000 + 1) {
      if (j >= v[i])
        dp2[j] = min(dp2[j], dp2[j - v[i]] + 1);
    }
  }
  int n;
  while (cin >> n, n) {
    cout << dp[n] << " " << dp2[n] << endl;
  }
}

Error: TLE

Fixed submission:

#include "bits/stdc++.h"

#define REP(i, n) for (ll i = 0; i < n; ++i)
#define RREP(i, n) for (ll i = n - 1; i >= 0; --i)
#define FOR(i, m, n) for (ll i = m; i < n; ++i)
#define RFOR(i, m, n) for (ll i = n - 1; i >= m; --i)
#define ALL(v) (v).begin(), (v).end()
#define PB(a) push_back(a)
#define UNIQUE(v) v.erase(unique(ALL(v)), v.end());
#define DUMP(v)                                                                \\
  REP(aa, (v).size()) {                                                        \\
    cout << v[aa];                                                             \\
    if (aa != v.size() - 1)                                                    \\
      cout << " ";                                                             \\
    else                                                                       \\
      cout << endl;                                                            \\
  }
#define INF 1000000001ll
#define MOD 1000000007ll
#define EPS 1e-9

const int dx[8] = {1, 1, 0, -1, -1, -1, 0, 1};
const int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll max(ll a, int b) { return max(a, ll(b)); }
ll max(int a, ll b) { return max(ll(a), b); }
ll min(ll a, int b) { return min(a, ll(b)); }
ll min(int a, ll b) { return min(ll(a), b); }
///(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)(テつエテ」ツδサテ渉嘉」ツδサ`)///

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n;
  while (cin >> n, n) {
    vi v;
    FOR(i, 1, INF) {
      v.push_back(i * (i + 1) * (i + 2) / 6);
      if (v[i - 1] >= n)
        break;
    }
    int m = v.size();
    vi dp(n + 1, INF);
    dp[0] = 0;
    REP(i, m) {
      REP(j, n + 1) {
        if (j >= v[i])
          dp[j] = min(dp[j], dp[j - v[i]] + 1);
      }
    }
    cout << dp[n] << " ";

    REP(j, n + 1) { dp[j] = INF; }

    dp[0] = 0;
    REP(i, m) {
      if (v[i] % 2 == 0)
        continue;

      REP(j, n + 1) {
        if (j >= v[i])
          dp[j] = min(dp[j], dp[j - v[i]] + 1);
      }
    }
    cout << dp[n] << endl;
  }
}