Submission #1102913

#TimeUsernameProblemLanguageResultExecution timeMemory
1102913alexdumitruFeast (NOI19_feast)C++17
0 / 100
146 ms9284 KiB
#include <iostream> using ll = int64_t; const int NMAX = 3e5; int n, k; int a[NMAX + 1]; ll sp[NMAX + 1]; ll ans; void read() { std::cin >> n >> k; for (int i = 1; i <= n; i++) { std::cin >> a[i]; sp[i] = sp[i - 1] + a[i]; } } std::pair<ll, int> dp[NMAX + 1]; bool operator < (const std::pair<ll, int> & a, const std::pair<ll, int> & b) { if (a.first != b.first) return a.first < b.first; return a.second < b.second; } bool operator > (const std::pair<ll, int> & a, const std::pair<ll, int> & b) { if (a.first != b.first) return a.first > b.first; return a.second > b.second; } std::pair<ll, int> operator + (const std::pair<ll, int> & a, const std::pair<ll, int> & b) { return std::make_pair(a.first + b.first, a.second + b.second); } std::pair<ll, int> ok(ll pen) { int idx = 0; for (int i = 1; i <= n; i++) { //dp[i] = dp[j] + sp[i] - sp[j] dp[i] = std::max(dp[i - 1], dp[idx] + std::make_pair(sp[i] - sp[idx] - pen, 1)); if (dp[i] + std::make_pair(-sp[i], 0) > dp[idx]) idx = i; } return dp[n]; } void solve() { ll st = 1; ll dr = 3e14; while (st <= dr) { ll mij = (st + dr) / 2; auto v = ok(mij); if (v.second <= k) { ans = v.first + mij * k; dr = mij - 1; } else { st = mij + 1; } } } void write_ans() { std::cout << ans << '\n'; } int main() { read(); solve(); write_ans(); 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...