社区讨论
n方过十亿
P3620[APIO/CTSC2007] 数据备份参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mmeuwmo3
- 此快照首次捕获于
- 2026/03/06 20:14 4 天前
- 此快照最后确认于
- 2026/03/08 13:05 前天
比赛时写的
O(n*k) 的 dp 加上奇奇怪怪的剪枝和卡常和 C++20 和 O2
然后过了
https://www.luogu.com.cn/record/265557865
CPP#include <cstdio>
int read()
{
int a = 0, ch = getchar_unlocked();
while (ch < 48 || ch > 57)
ch = getchar_unlocked();
while (48 <= ch && ch <= 57) {
a = a * 10 + (ch ^ 48);
ch = getchar_unlocked();
}
return a;
}
void print(int a)
{
if (a >= 10)
print(a / 10);
putchar((a % 10) | 48);
return;
}
int n, k;
int s[100010];
int dp[2][50010][2];
int main()
{
n = read();
k = read();
for (int i = 1; i <= n; i++)
s[i] = read();
dp[1][0][0] = 0;
for (int i = 2; i <= n; i++) {
dp[i & 1][0][0] = dp[i & 1][0][1] = 0;
for (int j = (1 >= (k - ((n - i) >> 1) - 1) ? 1 : (k - ((n - i) >> 1) - 1)), t = (k <= (i - 1 >> 1) ? k : (i - 1 >> 1)); j <= t; j++) {
dp[i & 1][j][0] = dp[i - 1 & 1][j][0] < dp[i - 1 & 1][j][1] ? dp[i - 1 & 1][j][0] : dp[i - 1 & 1][j][1];
dp[i & 1][j][1] = dp[i - 1 & 1][j - 1][0] + s[i] - s[i - 1];
}
(i & 1) ? 0 : (dp[i & 1][i >> 1][0] = 1e9, dp[i & 1][i >> 1][1] = dp[i - 1 & 1][(i >> 1) - 1][0] + s[i] - s[i - 1]);
}
print(dp[n & 1][k][0] < dp[n & 1][k][1] ? dp[n & 1][k][0] : dp[n & 1][k][1]);
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...