제출 #1341260

#제출 시각아이디문제언어결과실행 시간메모리
1341260dl2718281Feast (NOI19_feast)C++20
41 / 100
62 ms1944 KiB
#include <bits/stdc++.h>
using namespace std;

long arr[200001];
long dp[200001][2];
long cnt[200001][2];
long n;

pair<long,long> f(long p) {
    dp[0][0] = 0;
    dp[0][1] = 0;
    cnt[0][0] = 0;
    cnt[0][1] = 0;
    for (long i = 1; i <= n; i++) {
        dp[i][0] = max(dp[i-1][0],dp[i-1][1]-p);
        if (dp[i-1][0] > dp[i-1][1]-p) {
            cnt[i][0] = cnt[i-1][0];
        }
        else {
            cnt[i][0] = cnt[i-1][1]+1;
        }
        dp[i][1] = max(dp[i-1][0],dp[i-1][1])+arr[i];
        if (dp[i-1][0] > dp[i-1][1]) {
            cnt[i][1] = cnt[i-1][0];
        }
        else {
            cnt[i][1] = cnt[i-1][1];
        }
    }
    if (dp[n][0] > dp[n][1]-p) {
        return {dp[n][0],cnt[n][0]};
    }
    else {
        return {dp[n][1]-p,cnt[n][1]+1};
    }
}


int main() {
    long k;
    cin >> n >> k;
    for (long i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    long lower = 0;
    long upper = 1000000000000000;
    long a = 0;
    while (lower <= upper) {
        long mid = (lower+upper)/2;
        long x = f(mid).second;
        if (x >= k) {
            a = mid;
            lower = mid+1;
        }
        else {
            upper = mid-1;
        }
    }
    cout << f(a).first+f(a).second*a;
}
#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...