发现存在有序区间,就得考虑能不能二分,遍历基本是铁TLE
// Problem: 小红统计区间(easy)
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/73239/D
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Date: 2024-03-01 16:53:46
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
using namespace std;
int a[100005], s[100005],n,k;
//注意利用这点,s是有序数组
int check(int x) {
//找到l右边第一个s[r] >= s[l-1] + k的点
int tar = s[x - 1] + k;
int l = x, r = n + 1;
while (l < r) {
int mid = l + r >> 1;
if (s[mid] < tar)l = mid + 1;
else r = mid;
}
return l;
}
void solve() {
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
int tot = 0;
s[n + 1] = k;
for (int l = 1; l <= n; ++l) {
tot += n - check(l) + 1;
}
cout << tot << endl;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t = 1;
while (t--) {
solve();
}
return 0;
}