玄关
  • 板块灌水区
  • 楼主again_q
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/25 12:42
  • 上次更新2024/10/25 15:13:42
查看原帖
玄关
723168
again_q楼主2024/10/25 12:42

求助各位P3957 80pts

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10010;
typedef long long ll;
ll n,d,k,dis[N],v[N],dp[N];
ll l,r,ans=-1;
bool check(ll mid){
    deque<ll> d1;
    ll l=max(ll(1),d-mid),r=d+mid;
    ll las=0;
    memset(dp,-127,sizeof(dp));
    dp[0]=0;
    for(ll i=1;i<=n;i++){
        if(dis[las]<dis[i]-r)las++;
        while(!d1.empty() && dis[d1.front()]<dis[i]-r)d1.pop_front();
        while (dis[i]-l>=dis[las] && dis[i]-r<=dis[las] && las<i) {
            while(!d1.empty() && dp[d1.back()]<=dp[las])d1.pop_back();
            d1.push_back(las);
            las++;
        }
        if(!d1.empty())dp[i]=dp[d1.front()]+v[i];
        if(dp[i]>=k)return 1;
    }
    return 0;
}
int main(){
    cin>>n>>d>>k;
    for(ll i=1;i<=n;i++)cin>>dis[i]>>v[i];
    l=0;r=dis[n];
    while (l<=r) {
        ll mid=(l+r)>>1;//coin
        if(check(mid)){
            ans=mid;
            r=mid-1;
        }else{
            l=mid+1;
        }
    }
    cout<<ans;
    return 0;
}


2024/10/25 12:42
加载中...