题意:
给定长度为n的序列a,和一个整数k,
问有多少个子区间,满足区间和>=k。
数据范围:n<=1e5,1<=a(i)<=1e5,k<=1e10
解法:
枚举区间右端点R,计算满足条件的区间左端点数量,
我是将问题转换为总区间数量-区间和<k的区间数量,
如果[L,R]的区间和<k,因为a(i)一定是正数,那么[L+1,R]肯定也<k,满足单调性,
开一个指针维护左端点就行了。
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e5+5;
int a[maxm];
int n,k;
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=n*(n+1)/2;
int l=1;
int sum=0;
for(int i=1;i<=n;i++){
sum+=a[i];
while(l<=i&&sum>=k){
sum-=a[l++];
}
if(l<=i){
ans-=i-l+1;
}
}
cout<<ans<<endl;
return 0;
}