90 求助
查看原帖
90 求助
372119
DynamicProb楼主2021/10/7 16:35
#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 5e5+5;
const long long INF = 0x3f3f3f3f;
long long n, d, k ,ans = -1;
long long a[MAXN], x[MAXN];
long long q[MAXN], F[MAXN];

long long read(){
	long long x = 0, f = 1;
	char c = getchar();
	while (c<'0' || c>'9'){if (c=='-')f=-1; c = getchar();}
	while (c>='0'&& c<='9'){x = x*10+(c-'0'); c = getchar();}
	return x*f;
}

bool check(long long mid){
	long long S = max(d-mid, (long long)1);
	long long T = min(d+mid, x[n]);
	for (long long i=1;i<=n;i++) F[i] = -INF, q[i] = 0;
	F[0] = 0;
	long long f = 1, r = 0;
	for (long long i=1;i<=n;i++){
		long long idx = q[r]+1;
		while ((x[i]-x[idx]) >= S && idx < i){
				while (f<=r && F[q[r]] < F[idx]) r--;
				q[++r] = idx++;
		}
		
		while (f<=r && (x[i]-x[q[f]]) > T) f++;
		if (x[i] >= S && x[i] <= T) F[i] = a[i];
		if (f <= r){
			F[i] = max(F[q[f]]+a[i], F[i]);
		}
		if (F[i] >= k) return 1;
		
	}
	return 0;
}

int main(){
	n = read(), d = read(), k = read();
	for (long long i=1;i<=n;i++){x[i] = read(); a[i] = read();}
	long long L = 1, R = x[n], mid;
	while (L <= R){
		mid = (L+R) / 2;
		if (check(mid)){
			ans = mid;
			R = mid-1;
		}
		else L = mid+1;
	}
	cout << ans;
	return 0;
}
2021/10/7 16:35
加载中...