Submission #91813

#TimeUsernameProblemLanguageResultExecution timeMemory
91813SamAndMountain Trek Route (IZhO12_route)C++17
100 / 100
157 ms41772 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <queue>
#include <deque>
using namespace std;
const int N=1000006;
struct ban
{
    int l,r,x;
};

int n;
long long k;
int a[N],ll[N],rr[N];
long long b[N];
deque<ban> q;
int mm(int i)
{
    if(i==1)
        return n;
    return i-1;
}
int pp(int i)
{
    if(i==n)
        return 1;
    return i+1;
}
int main()
{
    //freopen("g.in","r",stdin);
    //freopen("g.out","w",stdout);
    ios_base::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;++i)
        cin>>a[i];
    ///////////////////////////////
    for(int i=1;i<=n;++i)
    {
        ban t;
        t.x=a[i];
        t.l=i;
        for(;a[i]==t.x && i<=n;++i)
            t.r=i;
        --i;
        ll[t.r]=t.l;
        rr[t.l]=t.r;
        q.push_back(t);
    }
    if(a[1]==a[n])
    {
        ban t1=q.front(),t2=q.back();
        q.pop_back();
        q.pop_front();
        ban t;
        t.x=a[1];
        t.l=t2.l;
        t.r=t1.r;
        ll[t.r]=t.l;
        rr[t.l]=t.r;
        q.push_back(t);
    }
    while(!q.empty())
    {
        ban t=q.front();
        q.pop_front();
        int l=t.l;
        int r=t.r;
        int x=t.x;
        ban h;
        if(l<=r)
        {
            if(!(a[l]<a[mm(l)] && a[r]<a[pp(r)]))
                continue;
            h.x=min(a[mm(l)],a[pp(r)]);
            b[r-l+1]+=(h.x-x);
        }
        else
        {
            if(!(a[l]<a[mm(l)] && a[r]<a[pp(r)]))
                continue;
            h.x=min(a[mm(l)],a[pp(r)]);
            b[r+n-l+1]+=(h.x-x);
        }
        h.l=l;
        h.r=r;
        if(h.x==a[mm(l)])
        {
            h.l=ll[mm(l)];
        }
        if(h.x==a[pp(r)])
        {
            h.r=rr[pp(r)];
        }
        ll[h.r]=h.l;
        rr[h.l]=h.r;
        q.push_front(h);
    }
    long long ans=0;
    for(int i=1;i<=n;++i)
    {
        long long x=(i*b[i]);
        if(k>=x)
        {
            k-=x;
            ans+=b[i];
        }
        else
        {
            ans+=(k/i);
            k=0;
            break;
        }
    }
    cout<<ans*2<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...