Submission #1269420

#TimeUsernameProblemLanguageResultExecution timeMemory
1269420k12_khoiStove (JOI18_stove)C++17
100 / 100
13 ms2376 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pii pair<ll,int>
#define X first
#define Y second

const int N=1e5+5;
const int oo=1e9+1;

int n,k;
int a[N];

namespace sub1
{
    int limit,res;
    bool check[N];

    void ql(int i,int used,int sum,bool onFire)
    {
        if (i>limit)
        {
            res=min(res,sum);
            return;
        }

        if (!check[i]) ql(i+1,used,sum,0);

        if (used+(onFire==false)<=k) ql(i+1,used+(onFire==false),sum+1,1);
    }

    void solve()
    {
        limit=a[n];

        for (int i=1;i<=n;i++)
        check[a[i]]=true;

        res=oo;
        ql(1,0,0,0);

        cout << res;
    }
}

namespace sub2
{
    int dp_before[N],dp_cur[N];

    void dnc(int l,int r,int optl,int optr)
    {
        if (l>r) return;

        int mid=(l+r)/2;

        int limit=min(optr,mid);

        pii best=make_pair(oo,0);
        for (int i=optl;i<=limit;i++)
        best=min(best,make_pair((ll)dp_before[i-1]+a[mid]-a[i]+1,-i));

        dp_cur[mid]=best.X;

        int opt=-best.Y;

        dnc(l,mid-1,optl,opt);
        dnc(mid+1,r,opt,optr);
    }

    void solve()
    {
        for (int i=1;i<=n;i++)
        dp_before[i]=a[i]-a[1]+1;

        for (int j=2;j<=k;j++)
        {
            dnc(1,n,1,n);

            for (int i=1;i<=n;i++)
            dp_before[i]=dp_cur[i];
        }

        cout << dp_before[n];
    }
}

namespace sub3
{
    pii cmp_pair(pii x,pii y)
    {
        if (x.X==y.X) return max(x,y);
        return min(x,y);
    }

    ll l,r,mid,res;
    pii dp[N];

    pii check(int lambda)
    {
        dp[1]=make_pair(1+lambda,1);

        for (int i=2;i<=n;i++)
        dp[i]=cmp_pair(make_pair(dp[i-1].X+a[i]-a[i-1],dp[i-1].Y),make_pair(dp[i-1].X+1+lambda,dp[i-1].Y+1));

        return dp[n];
    }

    void solve()
    {
        res=0;
        l=0;
        r=1e9;
        while (l<=r)
        {
            mid=(l+r)/2;
            if (check(mid).Y>=k)
            {
                l=mid+1;
                res=mid;
            }
            else r=mid-1;
        }

        cout << check(res).X-res*k;
    }
}

int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL); cout.tie(NULL);

    cin >> n >> k;
    for (int i=1;i<=n;i++)
    cin >> a[i];

    sub3::solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...