题意:找到一个连续的最短区间,使区间和大于等于x,求这个最短区间的长度。
题记:记录下这个数组的前缀和,标记一下前缀和大于等于x的第一个数的下标w,从w遍历到n在从0到i-1之间找一个前缀和s使a[i]-a[s]>=x。每次更新一下最短区间的长度即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N];
int n,x;
int bsearch(int l,int r,ll sum){
while(l<r){
ll mid=(l+r+1)>>1;
if(sum-a[mid]<x) r=mid-1;
else l=mid;
}
return l;
}
int main(){
while(cin>>n>>x){
a[0]=0;
int flag=0,w;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]=a[i]+a[i-1];
if(a[i]>=x&&!flag){
w=i;
flag=1;
}
}
if(a[n]<x){
cout<<-1<<endl;
continue;
}
int ans=n;
for(int i=w;i<=n;i++){
int s=bsearch(0,i-1,a[i]);
ans=min(ans,i-s);
}
cout<<ans<<endl;
}
return 0;
}