Problem p03780 (C++)

Buggy submission (status: Time Limit Exceeded):
// include
//------------------------------------------
#include <bits/stdc++.h>
using namespace std;

// typedef
//------------------------------------------
typedef long long LL;
typedef vector<LL> VL;
typedef vector<VL> VVL;
typedef vector<string> VS;
typedef pair<LL, LL> PLL;

// container util
//------------------------------------------
#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define SORT(c) sort((c).begin(), (c).end())
#define RSORT(c) sort((c).rbegin(), (c).rend())

// constant
//--------------------------------------------
const double EPS = 1e-10;
const double PI = acos(-1.0);
const int MOD = 1000000007;

// grid
//--------------------------------------------
VL dx = {0, 1, 0, -1};
VL dy = {1, 0, -1, 0};
VL dx2 = {-1, 0, 1, -1, 1, -1, 0, 1};
VL dy2 = {-1, -1, -1, 0, 0, 1, 1, 1};

// debug
//--------------------------------------------
#define dump(x) cerr << #x << " = " << (x) << endl
#define debug(x)                                                               \
  cerr << #x << " = " << (x) << " (L" << __LINE__ << ")"                       \
       << " " << __FILE__ << endl

// IO accelerate
//--------------------------------------------
struct InitIO {
  InitIO() {
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    cout << fixed << setprecision(30);
  }
} init_io;

// template
//--------------------------------------------
template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  for (T &x : vec)
    is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  for (int i = 0; i < vec.size(); i++) {
    os << vec[i] << (i + 1 == vec.size() ? "" : " ");
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &s, const vector<vector<T>> &vv) {
  for (int i = 0; i < vv.size(); ++i) {
    s << vv[i] << endl;
  }
  return s;
}
template <typename T>
ostream &operator<<(ostream &s, const vector<pair<T, T>> &vp) {
  for (int i = 0; i < vp.size(); ++i) {
    s << "(" << vp[i].first << "," << vp[i].second << ")"
      << (i + 1 == vp.size() ? "" : ",\t");
  }
  return s;
}

// 多重vector
// auto dp=make_v<int>(4,h,w) みたいに使える
template <typename T> vector<T> make_v(size_t a) { return vector<T>(a); }

template <typename T, typename... Ts> auto make_v(size_t a, Ts... ts) {
  return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}

// 多重vectorのためのfill
// fill_v(dp,0) みたいに使える
template <typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type fill_v(T &t, const V &v) {
  t = v;
}

template <typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type fill_v(T &t, const V &v) {
  for (auto &e : t)
    fill_v(e, v);
}

// main code

int main(int argc, char const *argv[]) {
  int n, k;
  cin >> n >> k;
  VL a(n);
  cin >> a;
  SORT(a);
  auto dp = make_v<bool>(n + 1, k);
  auto init = [&]() {
    for (int i = 0; i <= n; i++) {
      for (int j = 0; j < k; j++) {
        dp[i][j] = false;
      }
    }
    dp[0][0] = true;
  };
  init();

  auto isOk = [&](LL mid) {
    for (int i = 0; i <= n; i++) {
      if (mid == (i - 1)) {
        continue;
      }
      for (int j = k - 1; j >= 0; j--) {
        if (dp[i][j] and j + a[mid] >= k) {
          return false;
        }
      }
    }
    return true;
  };

  // 上界，下界が自明なら小さくしても良い
  LL ok = -1, ng = n;
  while (ng - ok > 1) {
    LL mid = (ng + ok) / 2;
    for (int i = 1; i <= n; i++) {
      if (mid == (i - 1)) {
        for (int j = 0; j < k; j++) {
          dp[i][j] = dp[i - 1][j];
        }
        continue;
      }
      for (int j = 0; j < k; j++) {
        dp[i][j] = (dp[i - 1][j] or dp[i][j]);
      }
      for (int j = 0; j + a[i - 1] < k; j++) {
        if (dp[i - 1][j]) {
          dp[i][j + a[i - 1]] = true;
        }
      }
    }
    (isOk(mid) ? ok : ng) = mid;
    init();
  }
  if (ng == -1)
    cout << 0 << endl;
  else
    cout << ok + 1 << endl;
  return 0;
}


Fixed submission:
// include
//------------------------------------------
#include <bits/stdc++.h>
using namespace std;

// typedef
//------------------------------------------
typedef long long LL;
typedef vector<LL> VL;
typedef vector<VL> VVL;
typedef vector<string> VS;
typedef pair<LL, LL> PLL;

// container util
//------------------------------------------
#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define SORT(c) sort((c).begin(), (c).end())
#define RSORT(c) sort((c).rbegin(), (c).rend())

// constant
//--------------------------------------------
const double EPS = 1e-10;
const double PI = acos(-1.0);
const int MOD = 1000000007;

// grid
//--------------------------------------------
VL dx = {0, 1, 0, -1};
VL dy = {1, 0, -1, 0};
VL dx2 = {-1, 0, 1, -1, 1, -1, 0, 1};
VL dy2 = {-1, -1, -1, 0, 0, 1, 1, 1};

// debug
//--------------------------------------------
#define dump(x) cerr << #x << " = " << (x) << endl
#define debug(x)                                                               \
  cerr << #x << " = " << (x) << " (L" << __LINE__ << ")"                       \
       << " " << __FILE__ << endl

// IO accelerate
//--------------------------------------------
struct InitIO {
  InitIO() {
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    cout << fixed << setprecision(30);
  }
} init_io;

// template
//--------------------------------------------
template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  for (T &x : vec)
    is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  for (int i = 0; i < vec.size(); i++) {
    os << vec[i] << (i + 1 == vec.size() ? "" : " ");
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &s, const vector<vector<T>> &vv) {
  for (int i = 0; i < vv.size(); ++i) {
    s << vv[i] << endl;
  }
  return s;
}
template <typename T>
ostream &operator<<(ostream &s, const vector<pair<T, T>> &vp) {
  for (int i = 0; i < vp.size(); ++i) {
    s << "(" << vp[i].first << "," << vp[i].second << ")"
      << (i + 1 == vp.size() ? "" : ",\t");
  }
  return s;
}

// 多重vector
// auto dp=make_v<int>(4,h,w) みたいに使える
template <typename T> vector<T> make_v(size_t a) { return vector<T>(a); }

template <typename T, typename... Ts> auto make_v(size_t a, Ts... ts) {
  return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}

// 多重vectorのためのfill
// fill_v(dp,0) みたいに使える
template <typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type fill_v(T &t, const V &v) {
  t = v;
}

template <typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type fill_v(T &t, const V &v) {
  for (auto &e : t)
    fill_v(e, v);
}

// main code

int main(int argc, char const *argv[]) {
  int n, k;
  cin >> n >> k;
  VL a(n);
  cin >> a;
  SORT(a);
  auto dp = make_v<bool>(n + 1, k);
  auto init = [&]() {
    dp = vector<vector<bool>>(n + 1, vector<bool>(k, false));
    dp[0][0] = true;
  };
  init();

  auto isOk = [&](LL mid) {
    for (int i = 0; i <= n; i++) {
      if (mid == (i - 1)) {
        continue;
      }
      for (int j = k - 1; j >= 0; j--) {
        if (dp[i][j] and j + a[mid] >= k) {
          return false;
        }
      }
    }
    return true;
  };

  // 上界，下界が自明なら小さくしても良い
  LL ok = -1, ng = n;
  while (ng - ok > 1) {
    LL mid = (ng + ok) / 2;
    for (int i = 1; i <= n; i++) {
      if (mid == (i - 1)) {
        for (int j = 0; j < k; j++) {
          dp[i][j] = dp[i - 1][j];
        }
        continue;
      }
      for (int j = 0; j < k; j++) {
        dp[i][j] = (dp[i - 1][j] or dp[i][j]);
      }
      for (int j = 0; j + a[i - 1] < k; j++) {
        if (dp[i - 1][j]) {
          dp[i][j + a[i - 1]] = true;
        }
      }
    }
    (isOk(mid) ? ok : ng) = mid;
    init();
  }
  if (ng == -1)
    cout << 0 << endl;
  else
    cout << ok + 1 << endl;
  return 0;
}