제출 #1368733

#제출 시각아이디문제언어결과실행 시간메모리
1368733hyyhFeast (NOI19_feast)C++20
0 / 100
72 ms3904 KiB
#include <iostream>
#include <math.h>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <iomanip>
#include <set>
#include <bitset>
#include <unordered_map>
#include <random>

using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
#define f first
#define s second
#define endl '\n'
#define all(x) begin(x),end(x)
#define m_p make_pair

int const N = 3e5+10;

int pref[N];
pii dp[N];
int n;

pii solve(int l){
    pii maxi = {0,0};
    dp[0] = {0,0};
    for(int i{1};i <= n;i++){
        dp[i] = dp[i-1];
        dp[i] = max(dp[i],{maxi.f+pref[i]-l,maxi.s+1});
        maxi = max(maxi,{dp[i].f-pref[i],dp[i].s});
    }
    return dp[n];
}

int main(){
    cin >> n;
    int k;cin >> k;
    int sum = 0;
    for(int i{1};i <= n;i++){
        int g;cin >> g;
        sum += max(-g,g);
        pref[i] = pref[i-1]+g;
    }
    int l = 0;
    int r = sum;
    // max l such that opt >= k
    // min l such that opt < k
    while(l < r){
        int md = l+(r-l-1)/2;
        pii sv = solve(md);
        if(sv.s < k) r = md;
        else l = md+1;
    }
    l--;
    if(l < 0) cout << 0;
    else cout << solve(l).f+k*(l);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…