This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
/// 17:28
typedef long long ll;
const int Nmax = 3e5 + 5, lim = 1e9;
pair<ll, int> dp[Nmax][2];
int a[Nmax], n, k;
pair<ll,int> best(pair<ll, int> a, pair<ll, int> b)
{
if(a.first == b.first) return a.second < b.second ? a : b;
return a.first > b.first ? a : b;
}
pair<ll, int> operator - (pair<ll, int> a, ll x)
{
return {a.first - x, a.second + 1};
}
pair<ll, int> operator + (pair<ll, int> a, ll x)
{
return {a.first + x, a.second};
}
pair<ll, int> solve(ll cost)
{
int i;
dp[0][0] = dp[0][1] = {0, 0};
for(i=1; i<=n; ++i)
{
dp[i][0] = best(dp[i-1][0], dp[i-1][1] - cost);
dp[i][1] = best(dp[i-1][0], dp[i-1][1]) + a[i];
}
return best(dp[n][0], dp[n][1] - cost);
}
int main()
{
// freopen("input", "r", stdin);
cin.sync_with_stdio(false); cin.tie(0);
cin >> n >> k;
int i;
for(i=1; i<=n; ++i) cin >> a[i];
ll mid, st = 0, dr = (ll) n * lim;
while(st <= dr)
{
mid = (st + dr) / 2;
if(solve(mid).second > k) st = mid + 1;
else dr = mid - 1;
}
cout << solve(st).first + (ll) k * st << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |