题目描述:
本题为easy版本,和hard版本的唯一区别是aia_iai保证是正整数!
小红拿到了一个数组,她想知道,有多少非空区间满足区间所有元素之和不小于kkk?
输入描述:
输出描述:
输出一个整数表示满足条件的非空区间个数。
示例1
输入
5 5
1 4 2 1 3
输出
8
AC代码两种:
#include<iostream>
using namespace std;
const int N = 1e5+10;
long long a[N],s[N];
int main()
{
long long n,k;
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++)
{
s[i] = s[i-1] + a[i];
}
long long res = 0;
for(int i=1;i<=n;i++)
{
//这里r要多开一个,因为在找不到的情况下r=n-1
//n-(n+1) + 1正好是0
long long l = 1,r = n+1;
//关于这里为什么要用左模板,是因为我们只要找最靠前的一个前缀和数组中的一个数,后面的就都满足
while(l < r)
{
long long mid = l + r >> 1;
//根据前缀和公式求区间,s[r] - s[l-1] 这个公式
if(s[mid] - s[i-1] >= k) r = mid;
else l = mid + 1;
}
res = res + n - l + 1;
}
cout << res;
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
LL a[N],s[N];
int main()
{
LL n,k;
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++) s[i] = s[i-1] + a[i];
LL ans = 0;
for(int i=1;i<=n;i++)
{
LL find = s[i-1] + k;
LL pos = lower_bound(s+1, s+n+1,find) - s;
ans += n - pos + 1;
}
cout << ans;
return 0;
}