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

#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <cmath>         //pow,logなど
#include <complex>       //複素数
#include <deque>         //両端アクセスのキュー
#include <functional>    //sortのgreater
#include <iomanip>       //setprecision(浮動小数点の出力の誤差)
#include <iostream>      //入出力
#include <iterator>      //集合演算(積集合,和集合,差集合など)
#include <map>           //map(辞書)
#include <numeric>       //iota(整数列の生成),gcdとlcm(c++17)
#include <queue>         //キュー
#include <set>           //集合
#include <stack>         //スタック
#include <string>        //文字列
#include <unordered_map> //イテレータあるけど順序保持しないmap
#include <unordered_set> //イテレータあるけど順序保持しないset
#include <utility>       //pair
#include <vector>        //可変長配列

using namespace std;
typedef long long ll;
#define PI 3.14159265358979323846264338327950L

// マクロ
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = (ll)(n)-1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = (a); i <= (b); i++)
#define FORD(i, a, b) for (ll i = (a); i >= (b); i--)
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define INF 1000000000000             // 10^12
#define MOD 10000007                  // 10^9+7
#define PB push_back

template <typename T, typename U, typename Comp = less<>>
bool chmax(T &xmax, const U &x, Comp comp = {}) {
  if (comp(xmax, x)) {
    xmax = x;
    return true;
  }
  return false;
}

template <typename T, typename U, typename Comp = less<>>
bool chmin(T &xmin, const U &x, Comp comp = {}) {
  if (comp(x, xmin)) {
    xmin = x;
    return true;
  }
  return false;
}

ll gcd(ll a, ll b) {
  if (a % b == 0) {
    return (b);
  } else {
    return (gcd(b, a % b));
  }
}

// scanf("%lld", &);
// cin >> ;
// cout << ans << endl;

ll N, M, K, Q, i, j, k, l, tmp, ans;

int main() {
  cin >> N >> M >> K;

  vector<ll> A(N, 0), B(M, 0);
  vector<ll> a(1, 0), b(1, 0);
  REP(i, N) { scanf("%d", &A.at(i)); }
  REP(i, M) { scanf("%d", &B.at(i)); }
  REP(i, N) { a.push_back(a[i] + A[i]); }
  REP(i, M) { b.push_back(b[i] + B[i]); }
  j = M;
  REP(i, N + 1) {
    if (a[i] > K) {
      break;
    }
    while (b[j] > K - a[i]) {
      j -= 1;
    }
    ans = max(ans, i + j);
  }
  cout << ans << endl;

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <cmath>         //pow,logなど
#include <complex>       //複素数
#include <deque>         //両端アクセスのキュー
#include <functional>    //sortのgreater
#include <iomanip>       //setprecision(浮動小数点の出力の誤差)
#include <iostream>      //入出力
#include <iterator>      //集合演算(積集合,和集合,差集合など)
#include <map>           //map(辞書)
#include <numeric>       //iota(整数列の生成),gcdとlcm(c++17)
#include <queue>         //キュー
#include <set>           //集合
#include <stack>         //スタック
#include <string>        //文字列
#include <unordered_map> //イテレータあるけど順序保持しないmap
#include <unordered_set> //イテレータあるけど順序保持しないset
#include <utility>       //pair
#include <vector>        //可変長配列

using namespace std;
typedef long long ll;
#define PI 3.14159265358979323846264338327950L

// マクロ
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = (ll)(n)-1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = (a); i <= (b); i++)
#define FORD(i, a, b) for (ll i = (a); i >= (b); i--)
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define INF 1000000000000             // 10^12
#define MOD 10000007                  // 10^9+7
#define PB push_back

template <typename T, typename U, typename Comp = less<>>
bool chmax(T &xmax, const U &x, Comp comp = {}) {
  if (comp(xmax, x)) {
    xmax = x;
    return true;
  }
  return false;
}

template <typename T, typename U, typename Comp = less<>>
bool chmin(T &xmin, const U &x, Comp comp = {}) {
  if (comp(x, xmin)) {
    xmin = x;
    return true;
  }
  return false;
}

ll gcd(ll a, ll b) {
  if (a % b == 0) {
    return (b);
  } else {
    return (gcd(b, a % b));
  }
}

// scanf("%lld", &);
// cin >> ;
// cout << ans << endl;

ll N, M, K, Q, i, j, k, l, tmp, ans;

ll read(ll t, ll cnt, queue<int> A, queue<int> B) {
  bool flag = false; // 再帰を行ったか
  ll cntA = 0;
  ll cntB = 0;
  // 空では無い　かつ　計算後にマイナスにならない場合
  if (!A.empty() && t - A.front() >= 0) {
    // A を読んだ場合で計算を行い、関数呼び出し
    cnt++;
    t -= A.front();
    A.pop();
    cntA = read(t, cnt, A, B);
    flag = true;
  }

  // 空では無い　かつ　計算後にマイナスにならない場合
  if (!B.empty() && t - B.front() >= 0) {
    // A を読んだ場合で計算を行い、関数呼び出し
    cnt++;
    t -= B.front();
    B.pop();
    cntB = read(t, cnt, A, B);
    flag = true;
  }

  if (flag) { // 再帰が行われている
    if (cntA < cntB) {
      return cntB;
    } else {
      return cntA;
    }
  } else { // 再帰が行われていない
    return cnt;
  }
}

int main() {
  cin >> N >> M >> K;

  queue<int> A, B;
  REP(i, N) {
    int a;
    scanf("%d", &a);
    A.push(a);
  }

  REP(i, M) {
    int b;
    scanf("%d", &b);
    B.push(b);
  }

  ans = read(K, 0, A, B);

  cout << ans << endl;

  return 0;
}