Submission #1298353

#TimeUsernameProblemLanguageResultExecution timeMemory
1298353david_g611Global Warming (CEOI18_glo)C++20
100 / 100
107 ms16680 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int NMAX=2e5;
int n, x, v[NMAX+1];

int LIS_end[NMAX+1]; ///length care se termina la i
vector<int> dp[NMAX+1];///strict crescator
vector<int> dp2[NMAX+1];///strict descrescator
int sz, sz2;

signed main()
{
    cin>>n>>x;
    for(int i=1; i<=n; i++)
        cin>>v[i];

    for(int i=1; i<=n; i++)
    {
        if(sz==0 || dp[sz].back() < v[i])
            dp[++sz].push_back(v[i]), LIS_end[i]=sz;
        else
        {
            int st=1, dr=sz, poz=0;
            while(st<=dr)
            {
                int mid=(st+dr)/2;
                if(dp[mid].back() < v[i])
                    poz=mid, st=mid+1;
                else
                    dr=mid-1;
            }

            dp[poz+1].push_back(v[i]);
            LIS_end[i]=poz+1;
        }
    }

    int ans=sz;
    for(int i=n; i>=2; i--)//pana la 2 ca n are sens sa fac update pe tot sirul
    {
        int poz=1;

        if(sz2==0 || dp2[sz2].back() > v[i])
            dp2[++sz2].push_back(v[i]), poz=sz2;
        else
        {
            int st=1, dr=sz2;
            while(st<=dr)
            {
                int mid=(st+dr)/2;
                if(dp2[mid].back() > v[i])
                    st=mid+1;
                else
                    poz=mid, dr=mid-1;
            }

            dp2[poz].push_back(v[i]);
            ///LIS care incepe la i de lungime poz = LIS_begin[i]
        }

        ///dau reverse la update-ul pe prefix ca sa trec la prefixul pana la i-1
        dp[LIS_end[i]].pop_back();

        ///si acum presupun ca solutia e formata cu LIS_begin[i]
        ///si caut un prefix unde pot sa pun acest numar

        int st=1, dr=n;
        int poz2=0;
        while(st<=dr)
        {
            int mid=(st+dr)/2;
            if(dp[mid].empty() || dp[mid].back() >= v[i]+x)
                dr=mid-1;
            else
                poz2=mid, st=mid+1;
        }

        ans=max(ans, poz+poz2);

    }
    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...