如题。这是 AC 的代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e5;
int n, d, qk;
int que[N * 2 + 10], hd = 1, tl = 0;
int f[N + 10], a[N + 10], x[N + 10];
bool check(int mid) {
int L = max(1ll, d - mid);
int R = d + mid;
memset(f, -0x3f, sizeof(f));
f[0] = 0, hd = 1, tl = 0;
int ans = -0x3f3f3f3f, j = 0;
for(int i = 1; i <= n; i++) {
while(j < i) {
if((x[i] - x[j]) >= L/* && (x[i] - x[j]) <= R*/) {
while(hd <= tl && f[que[tl]] < f[j])
tl--;
que[++tl] = j;
j++;
}
else break;
}
while(hd <= tl && !((x[i] - x[que[hd]]) >= L && (x[i] - x[que[hd]]) <= R))
hd++;
int jj = que[hd];
if(hd <= tl) f[i] = f[jj] + a[i];
ans = max(ans, f[i]);
}
return ans >= qk;
}
signed main() {
cin >> n >> d >> qk;
for(int i = 1; i <= n; i++)
cin >> x[i] >> a[i];
int l = 1, r = 1e9, ans = -1;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) r = mid - 1, ans = mid;
else l = mid + 1;
}
cout << ans << endl;
}
将 if((x[i] - x[j]) >= L/* && (x[i] - x[j]) <= R*/)
中注释掉的给加上就会 60pts WA,并不太能理解,求助各位巨佬 qwq