#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const long long INF=5e11;
int n, d, k, x[N], s[N], ans=0, L=0, R=0, hh=0, tt=0, q[N];
long long sum=0, f[N];
bool check(int p)
{
int st=0, j=0;
long long Max=0, Min=0;
Min=max(1, d-p), Max=d+p;
for (int i=1; i<=n; i++) f[i]=-INF;
for (int i=1; i<=n; i++)
if (x[i]>=Min && x[i]<=Max)
{
st=i;
break;
}
if (st==0) return 0;
f[st]=s[st], hh=1, tt=0, j=1;
for (int i=st+1; i<=n; i++)
{
while (hh<=tt && x[q[hh]]+Max<x[i]) hh++;
for (; j<=n && x[i]-x[j]>=Min; j++)
{
if (x[j]+Max<x[i]) continue;
while (hh<=tt && f[q[tt]]<f[j]) tt--;
q[++tt]=j;
}
f[i]=max(f[i], f[q[hh]]+s[i]);
}
for (int i=1; i<=n; i++) if (f[i]>=k) return 1;
return 0;
}
int main()
{
scanf("%d%d%d", &n, &d, &k);
for (int i=1; i<=n; i++)
{
scanf("%d%d", &x[i], &s[i]);
if (s[i]>0) sum+=s[i];
}
if (sum<k)
{
printf("-1");
return 0;
}
for (int i=1; i<n; i++) L=min(L, x[i]-x[i-1]);
R=1e9, L-=d;
while (L<=R)
{
int mid=(L+R)>>1;
if (check(mid)) ans=mid, R=mid-1;
else L=mid+1;
}
printf("%d", ans);
return 0;
}
rt,实在不知道问题出在哪了,WA了后5个点。
求助大佬!