Wrong Answer + TLE
查看原帖
Wrong Answer + TLE
1073182
luckzjm楼主2024/5/2 09:13

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;
}
2024/5/2 09:13
加载中...