20分求调
查看原帖
20分求调
1231930
Hermose_楼主2024/8/5 10:23
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N=5e5+5;
const ll INF=0x8080808080808080;
int n,d,k,l,r,ans=-1;
int q[N];
ll sum,dp[N];
struct node{
    int x,s;
}c[N];


ll f(int le,int ri)
{
    memset(dp,0x80,sizeof(dp));
    dp[0]=0;
    memset(q,0,sizeof(q));
    int hh=1,tt=0,j=0;
    for(int i=1;i<=n;i++)
    {
        while(c[i].x-c[j].x>=le && j<i)
        {
            if(dp[j]!=INF)
            {
                while(hh<=tt && dp[q[tt]]<=dp[j])
                    tt--;
                q[++tt]=j;
            }
            j++;
        }
        
        while(hh<=tt && c[i].x-c[q[hh]].x>ri)
            hh++;
        if(hh<=tt)
            dp[i]=dp[q[hh]]+c[i].s;
    }
    ll num=INF;
    // for(int i=1;i<=n;i++)
    //     num=max(num,dp[i]);
    for(int i=1;i<=n;i++)
    {
        if(dp[i]>num)
            num=dp[i];
    }
    return num;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>d>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>c[i].x>>c[i].s;
        if(c[i].s>0);
            sum+=c[i].s;
    }
    r=max(d,c[n].x);
    
    if(sum<k)
    {
        cout<<-1;
        return 0;
    }

    while(l<=r)
    {
        int mid=(l+r)/2;
        int lb=max(1,d-mid),rb=d+mid;
        ll p=f(lb,rb);

        if(p<k)
            l=mid+1;
        else
        {
            ans=mid;
            r=mid-1;
        }
    }

    cout<<ans;

    return 0;
}
2024/8/5 10:23
加载中...