萌新求助:单调队列优化DPWA6个点
查看原帖
萌新求助:单调队列优化DPWA6个点
316322
hzoi_liuchang楼主2020/7/26 21:22
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5;
int n,d,k;
int f[maxn],q[maxn],a[maxn],wz[maxn];
bool jud(int dd){
    memset(f,0,sizeof(f));
    memset(q,0,sizeof(q));
    int tmin=max(1,d-dd),tmax=d+dd;
    int ans=0;
    int head=1,tail=0;
    for(int i=1;i<=n;i++){
        while(head<=tail && wz[i]-wz[q[head]]>tmax) head++;
        if(wz[i]-wz[q[head]]>=tmin && wz[i]-wz[q[head]]<=tmax) f[i]=f[q[head]]+a[i];
        else f[i]=-0x3f3f3f3f;
        ans=max(ans,f[i]);
        while(head<=tail && f[q[tail]]<f[i]) tail--;
        q[++tail]=i;;
    }
    if(ans>=k) return 1;
    return 0;
}
int main(){
    scanf("%d%d%d",&n,&d,&k);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&wz[i],&a[i]);
    }
    int l=0,r=1e9,mids;
    while(l<=r){
        mids=(l+r)>>1;
        if(jud(mids)) r=mids-1;
        else l=mids+1;
    }
    if(l>1e9) printf("-1\n");
    else printf("%d\n",l);
    return 0;
}
2020/7/26 21:22
加载中...