답안 #1089600

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1089600 2024-09-16T19:16:05 Z xnqs K개의 묶음 (IZhO14_blocks) C++17
0 / 100
1 ms 468 KB
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>

const int BULAN = 20;
int x, p;
int arr[100005];
int sp_tb[17][100005];
int dp[105][100005];

void build_sparse_table() {
	for (int l = 1; l < 17; l++) {
		for (int i = 1; i+(1<<l)-1 <= x; i++) {
			sp_tb[l][i] = std::max(sp_tb[l-1][i], sp_tb[l-1][i+(1<<(l-1))]);
		}
	}
}

inline int max_query(int l, int r) {
	int lvl = 31-__builtin_clz(r-l+1);
	return std::max(sp_tb[lvl][l], sp_tb[lvl][r-(1<<lvl)+1]);
}

void calculate_dp() {
	dp[1][0] = 0x3f3f3f3f;
	for (int i = 1; i <= x; i++) {
		dp[1][i] = max_query(1,i);
	}

	for (int k = 2; k <= p; k++) {
		std::priority_queue<std::pair<int,int>, std::vector<std::pair<int,int>>, std::greater<std::pair<int,int>>> pq;
		for (int i = 0; i < k; i++) {
			dp[k][i] = 0x3f3f3f3f;
			pq.emplace(dp[k-1][i],i+1);
		}
		for (int i = k; i <= x; i++) {
			dp[k][i] = 0x3f3f3f3f;
			std::vector<std::pair<int,int>> tmp;
			for (int rep = 0; rep < BULAN && !pq.empty(); rep++) {
				auto [opt_dp, idx] = pq.top();
				dp[k][i] = std::min(dp[k][i], opt_dp + max_query(idx,i));
				tmp.emplace_back(opt_dp,idx);
				pq.pop();
			}
			while (!tmp.empty()) {
				pq.emplace(tmp.back());
				tmp.pop_back();
			}
		}
	}
}

int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);

	std::cin >> x >> p;
	for (int i = 1; i <= x; i++) {
		std::cin >> arr[i];
		sp_tb[0][i] = arr[i];
	}

	build_sparse_table();
	calculate_dp();

	std::cout << dp[p][x] << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 468 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Incorrect 0 ms 348 KB Output isn't correct
9 Halted 0 ms 0 KB -