제출 #1298344

#제출 시각아이디문제언어결과실행 시간메모리
1298344david_g611Global Warming (CEOI18_glo)C++20
0 / 100
63 ms5252 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]);
        else
        {
            int st=1, dr=sz, poz=st;
            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].push_back(v[i]);
            LIS_end[i]=poz;
        }
    }
    int ans=sz;
    for(int i=n; i>=2; i--)//pana la 2 ca n are sens sa fac update pe tot sirul
    {
        if(sz2==0 || dp2[sz2].back() > v[i])
            dp2[++sz2].push_back(v[i]);
        else
        {
            int st=1, dr=sz, poz=1;
            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

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

            ans=max(ans, poz+poz2+1);
        }
    }
    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...