如代码
#include<iostream>
#include<queue>
#include<cstring>
#define int long long
using namespace std;
int n, d, k, ans = -1;
int a[500005][3];
int f[500005];
int check(int g) {
int l = d - g, r = d + g;
if(l < 1)
l = 1;
deque<int> q;
memset(f, 0, sizeof(f));
int p = 0;
for(int i = 1; i <= n; i++) {
for(; p < i and a[i][1] - a[p][1] >= l; p++) {
while(!q.empty() and f[p] >= f[q.back()])
q.pop_back();
q.push_back(p);
}
while(!q.empty() and a[i][1] - a[q.front()][1] > r)
q.pop_front();
if(!q.empty())
f[i] = f[q.front()] + a[i][2];
else
f[i] = -999999999999;
if(f[i] >= k)
return 1;
}
return 0;
}
signed main() {
std::ios::sync_with_stdio(0);
cin>>n>>d>>k;
for(int i = 1; i <= n; i++)
cin>>a[i][1]>>a[i][2];
int ll = 0, rr = 1005;
int mid = (ll + rr) >> 1;
while(ll <= rr) {
if(check(mid) == 1){
ans = mid;
rr = mid - 1;
}
else
ll = mid + 1;
mid = (ll + rr) >> 1;
}
cout<<ans;
return 0;
}
为什么把第27行的f[i] = -999999999999;改成f[i] = (-1) * (1 << 31);就只有90pts ???