Submission #1214998

#TimeUsernameProblemLanguageResultExecution timeMemory
1214998long290429Feast (NOI19_feast)C++20
100 / 100
133 ms12172 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 300000; int n; ll k; ll a[MAXN]; pair<ll,ll> test(ll lmb) { vector<array<pair<ll,ll>,2>> dp(n); dp[0][0] = {0, 0}; dp[0][1] = {a[0] - lmb, 1}; for (int i = 1; i < n; i++) { // đóng subarray tại i dp[i][0] = max(dp[i-1][0], dp[i-1][1]); // mở hoặc tiếp tục subarray auto op1 = make_pair(dp[i-1][0].first + a[i] - lmb, dp[i-1][0].second + 1); auto op2 = make_pair(dp[i-1][1].first + a[i], dp[i-1][1].second); dp[i][1] = max(op1, op2); } return max(dp[n-1][0], dp[n-1][1]); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k; for (int i = 0; i < n; i++) { cin >> a[i]; } ll lo = 0, hi = 1e18; while (lo < hi) { ll mid = lo + (hi - lo + 1) / 2; if (test(mid).second >= k) lo = mid; else hi = mid - 1; } auto res = test(lo); // res.first đã trừ penalty lo mỗi subarray, // nên cộng lại lo*k để được tổng thật cout << (res.first + lo * k) << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...