loj 10181 绿色通道 二分答案+单调队列DP

空题段长度即为单调队列长度区间

每次二分答案进行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;
}

猜你喜欢

转载自www.cnblogs.com/asdic/p/9693280.html