这道题并不需要单调队列去优化,也可以不用令r==1005,稍微优化一下二分就可以了
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 500005;
const int INF = -0x3f3f3f3f;
typedef long long ll;
ll n,d,k;
ll a[maxn],b[maxn];
ll f[maxn];
ll dp[maxn];
ll low_x,high_x;
bool _find2(ll x){
low_x = 1;
high_x = d+x;
if(x<d){
low_x = d-x;
}
memset(dp,INF,sizeof(dp));
dp[0] = 0;
for(int i = 1;i<=n;i++){
for(int j = i-1;j>=0;j--){
if(low_x>(a[i]-a[j]))
continue;
if((a[i]-a[j])>high_x)
break;
dp[i] = max(dp[i],dp[j]+b[i]);
if(dp[i]>=k){
return 1;
}
}
}
return 0;
}
int main(){
scanf("%lld%lld%lld",&n,&d,&k);
ll mxxx = 0;
for(int i = 1;i<=n;i++){
scanf("%lld%lld",&a[i],&b[i]);
mxxx = max(mxxx,a[i]-a[i-1]);
}
ll l = 1,r = a[n];
if(d==1)
r = mxxx;
if(d>=1000)
r = mxxx;
ll m = 0;
ll mid;
while(l<=r){
mid = l + (r-l)/2;
if(_find2(mid)){
m = mid;
r = mid-1;
}else
l = mid+1;
}
printf("%lld",m);
return 0;
}