请问一下,D题这么做存在什么问题
//
// Created by good boy on 2024/1/14.
//
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll a[N];
ll n,k,res;
// 找到第一个大于k的位置r
int bsearch(int l,int r){
while(l<r){
int mid = (l+r)>>1;
if(a[r]-a[l-1]>=k)r = mid;
else l = mid+1;
}
return l;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1];
}
for(int i=1;i<=n;i++){
res += n-bsearch(i,n);
}
cout<<res<<endl;
return 0;
}
思路就是:拿到数组的前缀和,然后做二分查找,查找到第一个大于k的r的位置,那么不难确定,后面的位置的区间都是符合大于k的范围的
查看2道真题和解析