萌新刚学 OI,不太清楚这个地方,求助
查看原帖
萌新刚学 OI,不太清楚这个地方,求助
350270
CatFromMars楼主2024/9/19 19:24

如题。这是 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

2024/9/19 19:24
加载中...