社区讨论

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;
}
是不是可以申请tj(不想写)

回复

3 条回复,欢迎继续交流。

正在加载回复...