Submission #1147833

#TimeUsernameProblemLanguageResultExecution timeMemory
1147833alexbriFeast (NOI19_feast)C++20
0 / 100
1094 ms15524 KiB
#include<bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using ll = long long;
using vll = vector<ll>;
using ii = pair<int, int>;
using vii = vector<ii>;
using ld = long double;
#define rep(i, a, b) for (int i = a;  i < b; i++)
#define all(x) x.begin(), x.end()
#define pb(x) push_back(x)
#define sz(x) x.size()

pair<ld, int> f(vector<ld> &nums, ld x) {

    int n = nums.size();
    vector<ld> pf(n), dp(n);
    vi used(n);

    int best = 0;

    rep(i, 1, n) {
        pf[i] = pf[i - 1] + nums[i];
        dp[i] = pf[i] + dp[best] - pf[best] - x;
        used[i] = used[best] + 1;

        if (dp[i - 1] > dp[i]) {
            dp[i] = dp[i - 1];
            used[i] = used[i - 1];
        }

        if (dp[i] - pf[i] > dp[best] - pf[best])
            best = i;

    }

    best = 0;

    rep(i, 1, n)
        if (dp[i] > dp[best])
            best = i;
    
    return {dp[best], used[best]};
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);
    int n, k; cin >> n >> k;
    vector<ld> nums(n + 1); 
    rep(i, 0, n) {
        ll x; cin >> x;
        nums[i + 1] = x;
    }

    ld l = -1e13, r = 1e13;
    rep(_, 0, 200) {
        ld m = (l + r) / 2.00;
        ld g; 
        int opt;
        tie(g, opt) = f(nums, m);

        if (opt < k)
            r = m;
        else
            l = m;
    }
    
    cout << max(0ll, ll(f(nums, l).first + l * ld(k))) << "\n";
}

/*

    dp[l - 1] - pf[l - 1] - x

    Si voy a cerrar un subarreglo en r, me conviene que sea el que maximice el valor de 
    dp[l - 1] - pf[l - 1] - x

*/
#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...