wqs wa7 90求hack
  • 板块P1484 种树
  • 楼主lzyzs
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/12 13:09
  • 上次更新2024/11/12 17:29:05
查看原帖
wqs wa7 90求hack
362762
lzyzs楼主2024/11/12 13:09

rt

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 4e5 + 10, MF = 1e7;
int v[N], n, k;
int dp[N][2];
int cnt[N][2], ans, res1, res2;
bool check(int mid) {
	dp[1][0] = cnt[1][0] = 0;
	dp[1][1] = v[1] + mid;
	cnt[1][1] = 1;
	for (int i = 2; i <= n; i++) {
		if (dp[i - 1][0] > dp[i - 1][1]) dp[i][0] = dp[i - 1][0], cnt[i][0] = cnt[i - 1][0];
		else dp[i][0] = dp[i - 1][1], cnt[i][0] = cnt[i - 1][1];
		dp[i][1] = dp[i - 1][0] + v[i] + mid;
		cnt[i][1] = cnt[i - 1][0] + 1;
	}
	if (dp[n][0] > dp[n][1]) res1 = dp[n][0], res2 = cnt[n][0];
	else res1 = dp[n][1], res2 = cnt[n][1];
	if (res2 > k) return 0;
 	ans = res1 - mid * res2;
	return 1;
}
signed main () {
	scanf("%lld%lld", &n, &k);
	for (int i = 1; i <= n; i++) scanf("%lld", &v[i]);
	int l = -MF, r = MF;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (check(mid)) l = mid + 1;
		else r = mid;
	}
	cout << ans;
	return 0;
}
2024/11/12 13:09
加载中...