求助!80pts!
查看原帖
求助!80pts!
486441
13833925596mm楼主2023/3/3 22:36
#include<bits/stdc++.h>
using namespace std;
long long x[500001],v[500001];
long long n,d,m;
long long dp[500001];
bool cheak(long long o){
    long long ll=d-o;
    long long rr=d+o;
    if(ll<1) ll=1;
    for(long long i=1;i<=n;i++) dp[i]=-1e18;
    dp[0]=0;
    deque<long long>q;
    long long dv=0;
    for(long long i=1;i<=n;i++){
        while(q.size()!=0 && x[i]-x[q.front()]>rr) q.pop_front();
        while(x[dv]+rr<x[i] && dv<i) dv++;
        while(x[dv]+ll<=x[i] && dv<i){
            while(q.size()!=0 && dp[q.back()]<dp[dv]) q.pop_back();
            q.push_back(dv);
            dv++;
        }
        if(q.size()>0) dp[i]=dp[q.front()]+v[i];
        if(dp[i]>=m) return true;
    }
    return false;
}
int main(){
    cin>>n>>d>>m;
    for(long long i=1;i<=n;i++) cin>>x[i]>>v[i];
    long long l=0,r=n,mid;
    long long ans=-1;
    while(l<=r){
        mid=(l+r)/2;
        if(cheak(mid)){
            r=mid-1;
            ans=mid;
        }else l=mid+1;
    }
    cout<<ans;
    return 0;
}
2023/3/3 22:36
加载中...