前缀和,再二分
lower_bound()返回数组的所要找的值,找完所有都找到,则返回下一位,如果所有的都比当前小,返回第一位,(数据结构二叉堆)
#include<iostream>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
int a[100003];
int sum[100003];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int i,j;
for(i=0;i<n;i++)
cin>>a[i];
sum[0]=a[0];
for(i=1;i<n;i++)
{
sum[i]=sum[i-1]+a[i];
}
int ans=0x3f3f3f3f;
int tmp;
for(i=0;sum[i]+m<=sum[n-1];i++)
{
tmp=lower_bound(sum+i,sum+n,m+sum[i])-sum;
ans=min(ans,tmp-i);
}
if(ans==0x3f3f3f3f)
cout<<0<<endl;
else
cout<<ans<<endl;
}
}