The Price is Correct

問題

数列$a$と整数$p$が与えられる。 数列$a$の区間で、区間中の数の和が$p$以下であるものの数を答えよ。

解法

しゃくとり法。 $O(N)$。

実装

#include <iostream>
#include <vector>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
typedef long long ll;
using namespace std;
void solve() {
    int n; ll p; cin >> n >> p;
    vector<ll> b(n); repeat (i,n) cin >> b[i];
    ll ans = 0;
    ll acc = 0;
    int l = 0;
    repeat (r,n) { // [l,r]
        acc += b[r];
        while (p < acc) acc -= b[l ++];
        ans += r-l+1;
    }
    cout << ans << endl;
}
int main() {
    int testcases; cin >> testcases;
    repeat (testcase, testcases) {
        cout << "Case #" << testcase+1 << ": ";
        solve();
    }
    return 0;
}