제출 #1134118

#제출 시각아이디문제언어결과실행 시간메모리
1134118tuongllK blocks (IZhO14_blocks)C++20
100 / 100
101 ms1908 KiB
// #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <utility> #include <cmath> #include <ctime> #include <cassert> #include <set> #include <stack> #include <map> #include <queue> #include <random> #include <chrono> #include <bitset> #include <array> using ll = long long; #define debug(x) cout << #x << " = " << x << '\n' #define separator "===============================================\n" #define all(a) a.begin(), a.end() #define SZ(a) (int)(a).size() using namespace std; const int mxn = 1e5 + 3; const ll mod = 1e9 + 7; const int inf32 = 2e9; const ll inf64 = 3e18; void solve(){ int n, k; cin >> n >> k; vector<int> a(n + 1); for (int i = 1; i <= n; ++i) cin >> a[i]; vector<int> dp(n + 1), new_dp(n + 1, inf32); for (int i = 1; i <= n; ++i) dp[i] = max(dp[i - 1], a[i]); for (int j = 2; j <= k; ++j){ stack<pair<int, int>> st; for (int i = j; i <= n; ++i){ int best = dp[i - 1]; while(!st.empty() && st.top().first <= a[i]){ best = min(best, st.top().second); st.pop(); } if (st.empty() || a[i] + best < st.top().first + st.top().second) st.emplace(a[i], best); new_dp[i] = st.top().first + st.top().second; } swap(dp, new_dp); } cout << dp[n]; } int main(){ auto start = chrono::steady_clock::now(); ios_base::sync_with_stdio(false); cin.tie(NULL); int t = 1; // cin >> t; while(t--) solve(); chrono::duration<double> elapsed {chrono::steady_clock::now() - start}; cerr << "\n>> Runtime: " << elapsed.count() << "s\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...