P3597样例不过求条,玄关
  • 板块灌水区
  • 楼主_ScreamBrother_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/28 18:50
  • 上次更新2024/9/28 20:54:00
查看原帖
P3597样例不过求条,玄关
1047636
_ScreamBrother_楼主2024/9/28 18:50

样例一输出 20

#include <bits/stdc++.h>
long long N, D, K, G, dis[514514], val[514514], dp[514514], sum, l, r, m;
bool check(long long x) {
	std::deque <long long> dq;
	long long j = 0, lpos = std::max(1LL, D - G), rpos = D + G;
    for (long long i = 0; i <= N; i ++) dp[i] = i != 0 ? -1145141919 : 0;
	for (long long i = 1; i <= N; i ++) {
		for (; j < i && dis[i] - dis[j] >= lpos; dq.push_back(j), j ++)
			while (!dq.empty() && dp[j] >= dp[dq.back()]) dq.pop_back();
		while (!dq.empty() && dis[i] - dis[dq.front()] > rpos) dq.pop_front();
		if (!dq.empty()) dp[i] = dp[dq.front()] + val[i];
		if (dp[i] >= K) return true;
	}
	return false;
}
signed main() {
	std::cin >> N >> D >> K;
	for (long long i = 1; i <= N; i ++) std::cin >> dis[i] >> val[i];
	for (long long i = 1; i <= N; i ++) sum += val[i] > 0 ? val[i] : 0;
	if (sum < K) std::cout << "-1", exit(0);
	for (l = 1, r = dis[N]; l + 1 < r; (check(m) ? r : l) = m) m = (l + r) / 2;
	std::cout << r, exit(0);
}
2024/9/28 18:50
加载中...