Submission #1210404

#TimeUsernameProblemLanguageResultExecution timeMemory
1210404hypersphereFeast (NOI19_feast)C++17
100 / 100
794 ms23916 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define fi first
#define se second

 
const ll mod = 998244353;
const ll mod2 = 1e9 + 6;
const ll INF = 2e18;
const int INT_INF = 1e9 + 11;
// const double PI = acos(-1);
// mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
 
// ll rand(ll l, ll r)
// {
//     uniform_int_distribution<ll> uid(l, r);
//     return uid(mt);
// }
 
long long binpow(long long base, long long power, long long mod) {
    if (base == 0) return 0;
    if (base == 1) return 1;
    if (power <= 0) return 1;
    long long multiplier = (power % 2 == 0 ? 1 : base) % mod;
    return (multiplier * binpow((base * base) % mod, power / 2, mod)) % mod;
}

ll gcd(ll a, ll b) {
    if(b == 0) return a;
    return gcd(b, a % b);
}

int n;
pair<ll, int> solve(vector<ll>& arr, ll penalty){
    vector<vector<pair<ll, int>>> dp(n, vector<pair<ll, int>>(2));

    dp[0][0] = {0, 0};
    dp[0][1] = {arr[0] - penalty, 1};

    for (int i = 1; i < n; i++) {
        dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);

        dp[i][1] =
            max(make_pair(dp[i - 1][0].first + arr[i] - penalty, dp[i - 1][0].second + 1),
                make_pair(dp[i - 1][1].first + arr[i], dp[i - 1][1].second));
    }

    return max(dp[n - 1][0], dp[n - 1][1]);
}

void Run(){
    ll k; cin >> n >> k;
    vector<ll> arr(n + 1, 0);
    for(int i = 0; i < n; i++) cin >> arr[i];

    ll l = 0;
    ll r = 1e15;
    while(l < r){
        ll md = (l + r + 1) / 2;
        pair<ll, int> ans = solve(arr, md);
        if(ans.second >= k) l = md;
        else r = md - 1;
    }

    pair<ll, int> ans = solve(arr, l);
    cout << ans.first + l * k << "\n";
}

 
int main(){
    //freopen("point3.in", "r", stdin);
    //freopen("point3.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
 
    int test = 1;
    //cin >> test;
    auto time_start = clock();
    while(test--) Run();
    auto time_end = clock();
    cerr << "Time taken: " << time_end - time_start << "\n";
}
#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...