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

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REP1(i, a, b) for (int i = a; i <= (int)(b); i++)
#define ALL(x) begin(x), end(x)
#define PB push_back
using namespace std;
typedef int64_t LL;
typedef vector<int> VI;
typedef pair<int, int> PII;

template <class T> inline bool chmax(T &a, const T &b) {
  return b > a ? a = b, true : false;
}
template <class T> inline bool chmin(T &a, const T &b) {
  return b < a ? a = b, true : false;
}
template <class T> using MaxHeap = priority_queue<T>;
template <class T> using MinHeap = priority_queue<T, vector<T>, greater<T>>;
template <class T, class F = less<T>> void sort_uniq(vector<T> &v, F f = F()) {
  sort(begin(v), end(v), f);
  v.resize(unique(begin(v), end(v)) - begin(v));
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  LL n, m, k;
  cin >> n >> m >> k;
  vector<LL> a(n + 1), b(m + 1);
  REP(i, n) cin >> a[i];
  REP(i, m) cin >> b[i];

  int r = 0, ans = 0;
  LL sum = 0;
  int cnt = 0;
  {
    while (r < m && sum + b[r] <= k) {
      cnt++;
      sum += b[r++];
    }
    chmax(ans, cnt);
  }
  // cout << r << '\\n';
  --r;
  int l = 0;
  {
    while (l < n) {
      sum += a[l++];
      while (sum > k && r >= 0) {
        sum -= b[r--];
        cnt--;
      }
      if (sum > k)
        break;
      cnt++;
      chmax(ans, cnt);
    }
  }

  cout << ans << '\\n';
  return 0;
}

// 5 3 15
// 5 8 1 1 1
// 7 7 3

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REP1(i, a, b) for (int i = a; i <= (int)(b); i++)
#define ALL(x) begin(x), end(x)
#define PB push_back
using namespace std;
typedef int64_t LL;
typedef vector<int> VI;
typedef pair<int, int> PII;

template <class T> inline bool chmax(T &a, const T &b) {
  return b > a ? a = b, true : false;
}
template <class T> inline bool chmin(T &a, const T &b) {
  return b < a ? a = b, true : false;
}
template <class T> using MaxHeap = priority_queue<T>;
template <class T> using MinHeap = priority_queue<T, vector<T>, greater<T>>;
template <class T, class F = less<T>> void sort_uniq(vector<T> &v, F f = F()) {
  sort(begin(v), end(v), f);
  v.resize(unique(begin(v), end(v)) - begin(v));
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  VI a(n + 1), b(m + 1);
  REP(i, n) cin >> a[i];
  REP(i, m) cin >> b[i];
  a[n] = b[m] = 1e9 + 1;
  int ai = 0, bi = 0, ans = 0;
  while (true) {
    int s = ai, t = bi;
    if (s == n && t == m)
      break;
    // if ( a[s]!=b[t] ) {
    //     if ( a[s]<b[t] ) {
    //         if ( k<a[s] ) break;;
    //         k-=a[s];
    //         ai=++s;
    //     } else {
    //         if ( k<b[t] ) break;
    //         k-=b[t];
    //         bi=++t;
    //     }
    //     ans++;
    //     continue;
    // }

    while (s < n && t < m && a[s] == b[t]) {
      s++;
      t++;
    }

    // if ( s==n&&t==m ) {
    //     if ( k<a[ai] ) break;
    //     int cnt=k/a[ai];
    //     cnt=min(cnt,s-ai);
    //     ans+=cnt;
    //     ai=cnt;
    //     k-=a[ai]*cnt;
    //     continue;
    // }
    if (a[s] < b[t]) {
      while (k >= a[ai] && ai <= s) {
        ans++;
        k -= a[ai++];
      }
      // if ( k<a[ai] ) break;
      // int cnt=k/a[ai];
      // cnt=min(cnt,s-ai);
      // cout << cnt << '\\n';
      // ans+=cnt;
      // ai=cnt;
      // k-=a[ai]*cnt;
    } else {
      while (k >= b[bi] && bi <= t) {
        ans++;
        k -= b[bi++];
      }
      // if ( k<b[bi] ) break;
      // int cnt=k/b[bi];
      // cnt=min(cnt,t-bi);
      // ans+=cnt;
      // bi=cnt;
      // k-=b[bi]*cnt;
    }
  }
  cout << ans << '\\n';
  return 0;
}