这道题是一道前缀和加上二分的方法,不然会超时
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <string.h>
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define _for1(i,a,b) for( int i=(a); i<(b); ++i)
#define _for2(i,a,b) for( int i=(a); i>(b); i--)
#define _rep1(i,a,b) for( int i=(a); i<=(b); ++i)
#define _rep2(i,a,b) for( int i=(a); i>=(b); i--)
typedef long long ll;
using namespace std;
long long a[1000000 + 5];
long long sum[1000000 + 5];
int main()
{
long long n, k,cnt=0;
scanf("%lld %lld", &n, &k);
_rep1(i, 1, n) {
scanf("%lld", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
_rep1(i, 1, n) {
ll l = i, r = n, ans = -1;
while (r >= l) {
ll mid = (l + r) / 2;
if (sum[mid] - sum[i - 1] >= k) {
r = mid - 1;
ans = mid;
}
else
l = mid + 1;
}
if (ans != -1)
cnt += (n - ans + 1);
}
printf("%lld\n", cnt);
return 0;
}