Submission #554474

#TimeUsernameProblemLanguageResultExecution timeMemory
554474status_codingGlobal Warming (CEOI18_glo)C++14
100 / 100
65 ms11216 KiB
#include <bits/stdc++.h>

using namespace std;

struct change
{
    long long p, lval;

    change(long long p, long long lval)
    {
        this->p = p;
        this->lval = lval;
    }
};

long long n,k,ans;
long long a[200005];

long long dpl[200005];

long long dpr[200005];
vector<change> changes;

void init()
{
    ans = 0;

    dpl[0] = -1e18;
    for(int i=1;i<=n;i++)
        dpl[i] = 1e18;

    dpr[0] = 1e18;
    for(int i=1;i<=n;i++)
        dpr[i] = -1e18;
}

void addR(long long x)
{
    long long st=1, dr=n, mij, last=1;
    while(st <= dr)
    {
        mij = (st + dr)/2;

        if(dpr[mij] <= x)
        {
            last = mij;
            dr = mij-1;
        }
        else
            st = mij+1;
    }

    long long p = last;

    changes.push_back(change(p, dpr[p]));
    dpr[p] = x;
}

void delR()
{
    long long p = changes.back().p;
    long long lval = changes.back().lval;
    changes.pop_back();

    dpr[p] = lval;
}

long long queryR(long long x)
{
    long long st=0, dr=n, mij, last=0;
    while(st <= dr)
    {
        mij = (st+dr)/2;

        if(dpr[mij] > x)
        {
            last = mij;
            st = mij+1;
        }
        else
            dr = mij-1;
    }

    return last;
}

void addL(long long x)
{
    long long st=1, dr=n, mij, last=1;
    while(st <= dr)
    {
        mij = (st+dr)/2;

        if(dpl[mij] >= x)
        {
            last = mij;
            dr = mij-1;
        }
        else
            st = mij+1;
    }

    long long p = last;

    //cout<<p<<' '<<queryR(x-k)<<"\n\n";

    dpl[p] = x;
    ans = max(ans, (long long)p + queryR(x-k));
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

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

    init();

    for(int i=n;i>=1;i--)
    {
        addR(a[i]);

        /*
        cout<<"at pos "<<i<<'\n';
        for(int j=0; j<=n; j++)
        {
            if(dpr[j] == 0)
                break;

            cout<<dpr[j]<<' ';
        }
        cout<<"\n\n";
        */
    }

    for(int i=1;i<=n;i++)
    {
        //cout<<"at pos "<<i<<'\n';

        delR();
        addL(a[i]);

        /*
        cout<<"left is\n";
        for(int j=0;j<=n;j++)
        {
            if(dpl[j] == 1e18)
                break;

            cout<<dpl[j]<<' ';
        }
        cout<<"\n\n";


        cout<<"right is\n";
        for(int j=0;j<=n;j++)
        {
            if(dpr[j] == -1e18)
                break;

            cout<<dpr[j]<<' ';
        }
        cout<<"\n\n";
        */
    }

    cout<<ans;
    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...