空题段长度即为单调队列长度区间
每次二分答案进行check即可
#include<bits/stdc++.h> using namespace std; const int N=5e4+50; const int inf=0x3f3f3f3f; int n,t,l,r,mid,ans; int a[N],q[N],f[N]; int head,tail; bool check(int mid){ memset(f,0,sizeof f); memset(q,0,sizeof q); head=tail=1; for(int i=1;i<=n;i++){ while(head<=tail&&q[head]<i-mid-1) head++; f[i]=f[q[head]]+a[i]; while(head<=tail&&f[i]<=f[q[tail]]) tail--; q[++tail]=i; }int ans=inf; for(int i=n;i>=n-mid;i--) if(f[i]<=t) return 1; return 0; } int main(){ scanf("%d%d",&n,&t); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int l=1,r=n; while(l<=r){ int mid=(l+r)>>1; if(check(mid)) r=mid-1; else l=mid+1; } printf("%d\n",r+1);return 0; }