Submission #1281841

#TimeUsernameProblemLanguageResultExecution timeMemory
1281841nanj0178Feast (NOI19_feast)C++20
100 / 100
114 ms10836 KiB
#include <bitset>
#include<iostream>
// #include<fstream>
#include<vector>
#include<array>
#include<algorithm>
#include<set>
#include<cmath>
#include<unordered_map>
#include<iomanip>
#include <map>
#include <queue>
#include <stack>
#include <cstring>
#include <climits>
#include <chrono>
#include <random>
#include <cassert>
using namespace std;
#define PRINTARRAY(st, en, a) for(int _i = st; _i <= en; _i++) {cout << a[_i] << (_i != en ? " " : "\n");}
#define SZ(A) (int)A.size()
using LL = long long;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const LL INF = 1e18;
int n, k;
vector<int> A(n + 1, 0);
const int SIZE = 3e5;
array<LL,2> dp[SIZE][2];
array<LL, 2> f(LL x) {
    dp[1][0] = {0, 0};
    dp[1][1] = {A[1] - x, 1};
    for(int i = 2; i <= n; i++) {
        dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
        dp[i][1] = max(array<LL,2>{dp[i - 1][1][0] + A[i], dp[i - 1][1][1]}, array<LL,2>{dp[i - 1][0][0] + A[i] - x, dp[i - 1][0][1] + 1});
    }
    return max(dp[n][0],dp[n][1]);
}
void solve() {
    cin >> n >> k;
    A.assign(n + 1, 0);
    for(int i = 1; i <= n; i++) {
        cin >> A[i];
    }
    LL l = 0;
    LL r = 1e15;
    while(l < r) {
        LL mid = l + (r - l) / 2;
        auto [v, cnt] = f(mid);
        if (cnt >= k) {
            l = mid + 1;
        } else {
            r = mid;
        }
    }
    LL ansx = max(l - 1, 0LL);
    auto [v, cnt] = f(ansx);
    cout << v + k * ansx<< "\n";
}
    
int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(false);
    int testcase = 1;
    // cin >> testcase;
    while(testcase--) {
        solve();
    }
}
#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...