Subtask 2 TLE 求助
查看原帖
Subtask 2 TLE 求助
448887
cancan123456楼主2023/1/17 11:05
#include <cstdio>
#include <deque>
using namespace std;
typedef long long ll;
const int N = 3005;
ll f[N][N], a[N];
ll max(ll a, ll b) {
	return a > b ? a : b;
}
int main() {
	int n, k;
	scanf("%d %d", &n, &k);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			scanf("%lld", &f[i][j]);
		}
	}
	int p = 0;
	while ((1 << p) <= k) {
		p++;
	}
	p--;
	for (int k = 1; k <= p; k++) {
		for (int i = 1; i + (1 << k) - 1 <= n; i++) {
			for (int j = 1; j <= i + (1 << (k - 1)); j++) {
				a[j] = f[i + (1 << (k - 1))][j];
			}
			deque < int > q;
			for (int j = 1; j <= (1 << (k - 1)); j++) {
				while (!q.empty() && a[q.back()] <= a[j]) {
					q.pop_back();
				}
				q.push_back(j);
			}
			for (int j = 1; j <= i; j++) {
				while (!q.empty() && a[q.back()] <= a[j + (1 << (k - 1))]) {
					q.pop_back();
				}
				q.push_back(j + (1 << (k - 1)));
				while (q.front() < j) {
					q.pop_front();
				}
				f[i][j] = max(f[i][j], a[q.front()]);
			}
		}
	}
	ll ans = 0;
	for (int i = 1; i + k - 1 <= n; i++) {
		for (int j = 1; j <= i + k - (1 << p); j++) {
			a[j] = f[i + k - (1 << p)][j];
		}
		deque < int > q;
		for (int j = 1; j <= k - (1 << p); j++) {
			while (!q.empty() && a[q.back()] <= a[j]) {
				q.pop_back();
			}
			q.push_back(j);
		}
		for (int j = 1; j <= i; j++) {
			while (!q.empty() && a[q.back()] <= a[j + k - (1 << p)]) {
				q.pop_back();
			}
			q.push_back(j + k - (1 << p));
			while (q.front() < j) {
				q.pop_front();
			}
			ans += max(f[i][j], a[q.front()]);
		}
	}
	printf("%lld", ans);
	return 0;
}
2023/1/17 11:05
加载中...