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

#include <bits/stdc++.h>
#define mod 1000000007
#define F first
#define S second
#define PB push_back
#define MP make_pair

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m, k;
  cin >> n >> m >> k;
  vector<ll> a(n), b(m);
  vector<ll> sa(n), sb(m);
  cin >> a[0];
  sa[0] = a[0];
  for (int i = 1; i < n; i++) {
    cin >> a[i];
    sa[i] = a[i] + sa[i - 1];
  }
  cin >> b[0];
  sb[0] = b[0];
  for (int i = 1; i < m; i++) {
    cin >> b[i];
    sb[i] = b[i] + sb[i - 1];
  }
  int ans = 0;
  auto p = lower_bound(sb.begin(), sb.end(), k);
  if (p == sb.end()) {
    ans = m;
  } else {
    int len = p - sb.begin();
    if (*p > k) {
      ans = len;
    } else {
      ans = len + 1;
    }
  }
  // cout << "i " << ans << "\\n";
  for (int i = 0; i < n; i++) {
    ll rem = k - sa[i];
    if (rem < 0) {
      break;
    }
    auto pos = lower_bound(sb.begin(), sb.end(), rem);
    if (pos == sb.end()) {
      ans = max(ans, i + 1 + m);
    } else {
      if (*pos > rem) {
        int len = pos - sb.begin();
        ans = max(ans, i + 1 + len);
      } else {
        int len = pos - sb.begin();
        ans = max(ans, i + 2 + len);
      }
    }
    // cout << ans << ",";
  }
  cout << ans;
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define mod 1000000007
#define F first
#define S second
#define PB push_back
#define MP make_pair

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;

// int rec(vector<int> &a, vector<int> &b, int i, int j, int rem,
// vector<vector<int>> &dp)
// {
//     int la = (int)a.size();
//     int lb = (int)b.size();
//     if (i >= la && j >= lb)
//     {
//         return 0;
//     }
//     if (i <= la && j <= lb && dp[i][j] != -1)
//     {
//         return dp[i][j];
//     }
//     if (i < la && j < lb && a[i] <= rem && b[j] <= rem)
//     {
//         return dp[i][j] = 1 + max(rec(a, b, i + 1, j, rem - a[i], dp), rec(a,
//         b, i, j + 1, rem - b[j], dp));
//     }
//     else if (i < la && a[i] <= rem)
//     {
//         return dp[i][j] = 1 + rec(a, b, i + 1, j, rem - a[i], dp);
//     }
//     else if (j < lb && b[j] <= rem)
//     {
//         return dp[i][j] = 1 + rec(a, b, i, j + 1, rem - b[j], dp);
//     }
//     else
//     {
//         return 0;
//     }
// }

const int R = 200005;
int a[R];
int b[R];
map<pair<int, int>, int> dp;

int rec(int i, int j, int n, int m, int cap) {
  if (i >= n && j >= m) {
    return 0;
  }
  if (dp.count({i, j})) {
    return dp[{i, j}];
  }
  if (i < n && j < m && a[i] <= cap && b[j] <= cap) {
    return dp[{i, j}] = 1 + max(rec(i + 1, j, n, m, cap - a[i]),
                                rec(i, j + 1, n, m, cap - b[j]));
  }
  if (i < n && a[i] <= cap) {
    return dp[{i, j}] = 1 + rec(i + 1, j, n, m, cap - a[i]);
  }
  if (j < m && b[j] <= cap) {
    return dp[{i, j}] = 1 + rec(i, j + 1, n, m, cap - b[j]);
  }
  return 0;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m, k;
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (int i = 0; i < m; i++) {
    cin >> b[i];
  }
  cout << rec(0, 0, n, m, k);
  return 0;
}