Wrong Answer + TLE 了,不求满分,就是不知道为啥Wrong Answer了
// https://www.luogu.com.cn/problem/P6648
// https://www.luogu.com.cn/problem/U120704
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6;
int a[N];
int ans[3005];
int dp[3005][25];
int LOG2[3005];
int mp[3005][3005];
void init(int l, int r) {
int m = r - l + 1;
for (int i = 1; i <= m; ++i) {
dp[i][0] = a[l + i - 1];
}
for (int i = 1; (1 << i) <= m; ++i) {
for (int j = 1; j + (1 << i) <= m + 1; ++j) {
dp[j][i] = max(dp[j][i - 1], dp[j + (1 << (i - 1))][i - 1]);
}
}
}
int get(int l, int r) {
int m = r - l + 1;
int ans = max(dp[l][LOG2[m]], dp[r - (1 << LOG2[m]) + 1][LOG2[m]]);
return ans;
}
int main() {
int n, k, cnt, res = 0;
scanf("%d%d", &n, &k);
cnt = n * (n + 1) / 2;
for (int i = 1; i <= cnt; ++i) {
scanf("%d", &a[i]);
}
int t = 1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= i; ++j)
mp[i][j] = t, ++t;
LOG2[0] = -1;
for (int i = 1; i <= 3002; ++i) {
LOG2[i] = LOG2[i >> 1] + 1;
}
for (int i = 1; i <= n; ++i) {
int l = (i - 1) * i / 2 + 1, r = (i + 1) * i / 2;
init(l, r);
for (int a = 1; a <= i; ++a) { // 当前第一个节点
for (int x = 0; a + x <= i && x < k; ++x) { // 长度 - 1
if (n - i < k - x - 1) continue;
ans[mp[i - x][a]] = max(get(a, a + x), ans[mp[i - x][a]]); // i - x 行 a 列
}
}
}
for (int i = 1; i <= (n - k + 2) * (n - k + 1) / 2; ++i) {
res += ans[i];
}
printf("%d", res);
return 0;
}