제출 #506093

#제출 시각아이디문제언어결과실행 시간메모리
506093MasterTasterGlobal Warming (CEOI18_glo)C++14
100 / 100
73 ms4972 KiB
#include <bits/stdc++.h>

#define pb push_back
#define ll long long
#define pii pair<int, int>
#define xx first
#define yy second
#define MAXN 200010
#define endl "\n"

using namespace std;

int n, x, a[MAXN], b[MAXN], dp[MAXN], lvd[MAXN], ress=-1; ///lvd=lis veci desno

int binarna(int cnt, int k)
{
    int l=0, r=cnt-1;
    int ret=-1;
    while (l<=r)
    {
        int mid=l+(r-l)/2;
        if (dp[mid]<k)
        {
            ret=mid;
            l=mid+1;
        }
        else
            r=mid-1;
    }
    return ret;
}
int prviveci(int cnt, int k)
{
    int l=0, r=cnt-1;
    int ret=-1;
    while (l<=r)
    {
        int mid=l+(r-l)/2;
        if (dp[mid]>k)
        {
            ret=mid;
            r=mid-1;
        }
        else
            l=mid+1;
    }
    return ret;
}

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

    cin>>n>>x;
    int maxx=-1;
    for (int i=0; i<n; i++) { cin>>a[i]; maxx=max(maxx, a[i]); }

    for (int i=0; i<n; i++) b[i]=maxx-a[i];

    dp[0]=b[n-1];
    int cnt=1;
    lvd[n-1]=0; lvd[n-2]=0;
    if (a[n-1]>(a[n-2]-x)) lvd[n-2]=1;
    for (int i=n-2; i>/*=*/0; i--)
    {
        if (b[i]<dp[0]) dp[0]=b[i];
        else if (b[i]>dp[cnt-1]) dp[cnt++]=b[i];
        else
        {
            auto gde=prviveci(cnt, b[i]);
            if (gde==0 || dp[gde-1]!=b[i])
            {
                auto gde=prviveci(cnt, b[i]);
                dp[gde]=b[i];
            }
        }
        int kolko=a[i-1]-x;
        //cout<<i-1<<" "<<maxx-kolko<<" "<<cnt<<endl;
        lvd[i-1]=binarna(cnt, maxx-kolko)+1;
    }

    //for (int i=0; i<n; i++) cout<<lvd[i]<<" ";
    //cout<<endl;

    a[0]-=x;
    dp[0]=a[0];
    ress=max(ress, lvd[0]+1);
    cnt=1;
    for (int i=1; i<n; i++)
    {
        a[i]-=x;
        if (a[i]<dp[0]) dp[0]=a[i];
        else if (a[i]>dp[cnt-1]) dp[cnt++]=a[i];
        else
        {
            auto gde=prviveci(cnt, a[i]);
            if (gde==0 || dp[gde-1]!=a[i])
            {
                auto gde=prviveci(cnt, a[i]);
                dp[gde]=a[i];
            }
        }
        int kolko=binarna(cnt, a[i]);
        kolko++;
        ress=max(ress, (kolko+lvd[i]+1));
    }
    ress=max(ress, cnt);
    cout<<ress;

}
/*
15
20
1 7 3 20 8 3 17 10 3 27 14 17 13 9 15

5
10
1 4 2 7 10

5
1
1 4 2 7 10
*/
#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...