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

// コンパイラ最適化用
#pragma GCC optimize("Ofast")

// インクルード(アルファベット順)
#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <chrono>        //実行時間計測
#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,accumulate
#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;

// clang++ main.cc -std=c++11 -stdlib=libc++

signed main() {
  /*
    cin >> N;
    vector<int> a(N);
    for (int i = 0; i < N; i++)
      cin >> a[i];
  */
  int N, M, K;
  cin >> N >> M >> K;

  vector<int> A(N), B(M);
  for (int i = 0; i < N; i++)
    cin >> A[i];
  for (int i = 0; i < M; i++)
    cin >> B[i];

  int b_books = 0;
  ll sum = 0;
  for (int i = 0; i < M; i++) {
    if (sum + B[i] > K)
      break;
    sum += B[i];
    b_books = i + 1;
  }

  int res = b_books;
  int a_books = 0;
  for (int i = 0; i < N; i++) {
    if (sum + A[i] <= K)
      sum += A[i];
    else {
      while (b_books && sum + A[i] > K) {
        sum -= B[b_books - 1];
        b_books--;
        if (b_books == 0)
          break;
      }
      if (sum + A[i] > K)
        break;
      sum += A[i];
    }
    a_books = i + 1;
    res = max(res, a_books + b_books);
  }
  cout << res << endl;
  return 0;
}

Error: TLE

Fixed submission:

// コンパイラ最適化用
#pragma GCC optimize("Ofast")

// インクルード(アルファベット順)
#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <chrono>        //実行時間計測
#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,accumulate
#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;

// clang++ main.cc -std=c++11 -stdlib=libc++

signed main() {
  /*
    cin >> N;
    vector<int> a(N);
    for (int i = 0; i < N; i++)
      cin >> a[i];
  */
  int N, M, K;
  cin >> N >> M >> K;

  vector<int> A(N), B(M);
  for (int i = 0; i < N; i++)
    cin >> A[i];
  for (int i = 0; i < M; i++)
    cin >> B[i];

  int a_sum = 0;
  int res = 0;
  for (int i = 0; i <= N; i++) {
    if (i != 0)
      a_sum += A[i - 1];
    if (a_sum > K)
      break;

    int b_sum = 0;
    for (int j = 0; j <= M; j++) {
      if (j != 0)
        b_sum += B[j - 1];
      if (a_sum + b_sum > K)
        break;
      res = max(res, i + j);
    }
  }
  cout << res << endl;
  return 0;
}