求助各位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;
}