제출 #535637

#제출 시각아이디문제언어결과실행 시간메모리
535637leakedFeast (NOI19_feast)C++14
100 / 100
177 ms12776 KiB

#include <bits/stdc++.h>

#define f first
#define s second
#define m_p make_pair
#define vec vector
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define sz(x) (int)(x).size()
#define pw(x) (1LL<<(x))
#define int long long
#define fast_resp ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;
template<class T> bool umin(T &a,const T &b){return (a>b?a=b,1:0);}
template<class T> bool umax(T &a,const T &b){return (a<b?a=b,1:0);}
const ll inf=1e18;
signed main(){
    fast_resp;
    int n,k;
    cin>>n>>k;
    vec<int>a(n);
    for(auto &z : a) cin>>z;
    vec<ll>pref(n,0);
    for(int i=0;i<n;i++) pref[i]=(i?pref[i-1]:0)+a[i];
    auto check=[&](ll x){
        vec<pll>dp(n+1,m_p(-inf,-1));
        pll mx={0,0};
        dp[0]={0,0};
//        cout<<"CHECK "<<x<<endl;
        for(int i=0;i<n;i++){
            dp[i+1]=dp[i];
            umax(dp[i+1],m_p(dp[i].f-x,dp[i].s+1));
            umax(dp[i+1],m_p(mx.f+pref[i]-x,mx.s+1));
            umax(mx,m_p(dp[i+1].f-pref[i],dp[i+1].s));
//            cout<<"I "<<dp[i+1].f<<endl;
        }
//        cout<<"W "<<dp[n].f<<' '<<dp[n].s<<endl;
        return dp[n];
    };
    ll l=0,r=1e18;
    while(l!=r){
        ll tm=(l+r)/2;
        if(check(tm).s<k) r=tm;
        else l=tm+1;
    }
    --l;
//    cout<<k<<' '<<l<<endl;
    cout<<check(l).f+1ll*k*l;
    return 0;
}
/*

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