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>
#define ll long long
#define ld long double
#define X first
#define Y second
#define MP make_pair
using namespace std;
const int N = 3e5 + 12;
int n, k;
ll a[N];
pair<ld, int> dp[N][2];
void prints(pair<ld, int> x) {
cerr << x.X << " " << x.Y;
}
pair<ld, int> get(ld m, bool debug = 0) {
dp[1][0] = {0, 0};
dp[1][1] = {a[1] - m, 1};
for(int i = 2;i <= n;i++) {
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = max(MP(dp[i - 1][0].X + a[i] - m, dp[i - 1][0].Y + 1),
MP(dp[i - 1][1].X + a[i], dp[i - 1][1].Y));
if(debug) {
prints(dp[i][0]), cerr << " | ", prints(dp[i][1]);
cerr << "\n";
}
}
return max(dp[n][0], dp[n][1]);
}
int main () {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> k;
for(int i = 1;i <= n;i++)
cin >> a[i];
ld l = 0, r = 1e15;
for(int it = 0;it < 100;it++) {
ld m = (l + r) / 2;
auto mid = get(m);
if(mid.Y >= k) {
l = m;
}
else {
r = m;
}
}
auto mid = get(l);
ll answer = round(mid.X + l * k);
cout << answer;
}
# | 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... |