With a doubling to do
First, get a prefix and an array of sum
Then traversal starting from 1-n, if the sum [k + p] -sum [p] satisfied, p << = 1, or p >> = 1 finally obtained a minimum length
Topic Code
Do not pay attention to make cross-border k
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; typedef long long LL; const int maxn=1e5+7; const int inf=0x3f3f3f3f; LL sum[maxn],s; int n,a[maxn],t; int main(){ scanf("%d",&t); while(t--){ scanf("%d%lld",&n,&s); sum[0]=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } int minlen=inf; for(int i=1;i<=n;i++){ int k=i-1,p=1,ans=0; while(p){ while(k+p>n)p>>=1; if(sum[k+p]-sum[k]+ans<s){ ans+=sum[k+p]-sum[k]; k+=p; p<<=1; } else p>>=1; } if(k<n)minlen=min(minlen,k-i+2); } if(minlen==inf)printf("0\n"); else printf("%d\n",minlen); } return 0; }