제출 #556055

#제출 시각아이디문제언어결과실행 시간메모리
556055HeatDroppaStove (JOI18_stove)C++14
50 / 100
1079 ms3628 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll lim=1e5+4;
const ll inf=1e18;
vector<ll> dp_new;
vector<ll> dp_old;
ll t[lim];
ll n,k;
ll cost(ll l,ll r)
{
    return t[r]+1-t[l];
}
void solve(ll l,ll r,ll optl,ll optr)
{
    if(l>r) return ;
    ll med=(l+r)>>1;
    pair<ll,ll> bst={inf,-1};
    for(ll i=optl;i<=min(med,optr);++i)
        bst=min(bst,{dp_old[i-1]+cost(i,med),i});
    ll opt=bst.second;
    dp_new[med]=bst.first;
    solve(l,med-1,optl,opt);
    solve(med+1,r,opt,optr);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>k;
    dp_new.resize(n+2,0);
    dp_old.resize(n+2,0);
    for(ll i=1;i<=n;++i)
        cin>>t[i];
    for(ll i=1;i<=n;++i)
        dp_old[i]=cost(1,i);
    for(ll i=2;i<=k;++i)
        solve(1,n,1,n),
        swap(dp_old,dp_new);
    cout<<dp_old[n]<<'\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...