Submission #754154

#TimeUsernameProblemLanguageResultExecution timeMemory
754154OlympiaK blocks (IZhO14_blocks)C++17
53 / 100
1079 ms3372 KiB
#include <vector> #include <iostream> #include <cassert> #include <cmath> #include <map> #include <set> using namespace std; int main () { ios_base::sync_with_stdio(false); cin.tie(NULL); int N, K; cin >> N >> K; int64_t arr[N]; for (int i = 0; i < N; i++) { cin >> arr[i]; } int64_t INF = 1e17; vector<int64_t> prev(N + 1), cur(N + 1); prev.assign(N + 1, INF), cur.assign(N + 1, INF); for (int j = 1; j <= N; j++) { prev[j] = ((j == 1) ? arr[0] : max(prev[j - 1], arr[j - 1])); } for (int i = 2; i <= K; i++) { vector<pair<pair<int64_t,int64_t>,pair<int64_t,int64_t>>> ranges; for (int j = 1; j <= N; j++) { cur[j] = INF; if (j == 1) { cur[1] = prev[0] + arr[0]; ranges.push_back(make_pair(make_pair(arr[0], prev[0]), make_pair(0, 0))); } else { int64_t mn = prev[j - 1]; while (!ranges.empty() and ranges.back().first.first <= arr[j - 1]) { mn = min(mn, ranges.back().first.second); ranges.pop_back(); } if (ranges.empty()) { ranges.push_back(make_pair(make_pair(arr[j - 1], mn), make_pair(0, j - 1))); } else { ranges.push_back(make_pair(make_pair(arr[j - 1], mn), make_pair(ranges.back().second.second + 1, j - 1))); } for (auto& p: ranges) { cur[j] = min(cur[j], p.first.first + p.first.second); } } } swap(cur, prev); } cout << prev[N]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...