Submission #1319490

#TimeUsernameProblemLanguageResultExecution timeMemory
1319490jxuFeast (NOI19_feast)C++20
100 / 100
194 ms6208 KiB
#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define pb push_back
typedef long long ll;
typedef pair<int, int> pi;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef tuple<int, int, int> ti;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

#ifdef LOCAL
#include <debug.h>
#else
#define debug(...)
#define debugArr(...)
#endif

const int MOD = 1000000007;
const char nl = '\n';

struct Line {
	mutable ll k, m, p;
	bool operator<(const Line& o) const { return k < o.k; }
	bool operator<(ll x) const { return p < x; }
};

void solve() {
    int n, k; cin >> n >> k;
    vi A(n);
    rep(i, 0, n) cin >> A[i];

    typedef pair<ll, ll> en;
    const ll inf = 1e18;
    auto calc = [&] (ll m) {
        // dp[i]: max value from i..n given most recent starts at i
        // I am maxing, so I want to min intervals
        vector<en> dp(n + 1);
        en mx = {0, 0};
        for (int i = n - 1; i >= 0; i--) {
            // start new interval
            en cand = mx;
            cand.first += max(A[i] - m, -m);
            cand.second++;
            dp[i] = cand;


            // extends interval
            cand = dp[i + 1];
            if (cand.second != 0) {
                cand.first += A[i];
                dp[i] = max(dp[i], cand);
            }
            mx = max(dp[i], mx);
        }

        return mx;
    };

    // low: use all ops, high: use no ops
    ll low = -1;
    ll high = 1e15;
    while(low + 1 < high) {
        ll mid = low + (high - low)/2;
        en res = calc(mid);
        ll ops = res.second;
        if (ops >= k) {
            low = mid;
        } else {
            high = mid;
        }
    }
    en res = calc(low);
    cout << res.first + (ll)k * low << nl;
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);
    int t = 1;
    //cin >> t;
    while(t--) 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...