제출 #395843

#제출 시각아이디문제언어결과실행 시간메모리
395843Pichon5Global Warming (CEOI18_glo)C++17
100 / 100
128 ms5264 KiB

#include<bits/stdc++.h>
#include <chrono>
#include <thread>
#define lcm(a,b) (a/__gcd(a,b))*b
#define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long int
#define vi vector<int>
#define vll vector<ll>
#define pb push_back
#define F first
#define S second
#define mp make_pair
//salida rapida "\n"
//DECIMALES fixed<<sp(n)<<x<<endl;
//gcd(a,b)= ax + by
//lCB x&-x
//set.erase(it) - ersases the element present at the required index//auto it = s.find(element)
//set.find(element) - iterator pointing to the given element if it is present else return pointer pointing to set.end()
//set.lower_bound(element) - iterator pointing to element greater than or equal to the given element
//set.upper_bound(element) - iterator pointing to element greater than the given element
// | ^
//__builtin_popcount(x)
using namespace std;
const ll INF=1e16;
int main()
{
    //freopen("glo6a.in","r",stdin);
    ll n,k,x;
    cin>>n>>k;
    vll v;
    ll res=0;
    for(int i=0;i<n;i++){
        cin>>x;
        v.pb(x);
    }
    vll E(n+1);
    vll dp(n+2,INF);
    dp[0]=-INF;
    for(int i=0;i<n;i++){
        int b=1,e=n;
        while(b<=e){
            ll mid=(b+e)/2;
            if(v[i]<=dp[mid] && dp[mid-1]<v[i]){
                dp[mid]=v[i];
                //cout<<v[i]<<" menor a "<<dp[mid]<<"  -  "<<dp[i-1]
                res=max(res,mid);
                E[i]=mid;break;
            }
            if(dp[mid]>v[i]){
                e=mid-1;
            }else{
                b=mid+1;
            }
        }
    }
    dp.assign(n+2,INF);
    dp[0]=-INF;
    for(int i=n-1;i>=0;i--){
        int b=1,e=n;
        int val=-v[i]+k;//le reduzco a todo el prefijo i, eso es darle ventaja a i sobre el sufijo
        while(b<=e){
            int mid=(b+e)/2;
            if(val<dp[mid] && dp[mid-1]<val){
                res=max(res,E[i]+mid-1);
                break;
            }
            if(dp[mid]>val){
                e=mid-1;
            }else{
                b=mid+1;
            }
        }
        val=-v[i];
        b=1,e=n;
        while(b<=e){
            int mid=(b+e)/2;
            if(val<dp[mid] && dp[mid-1]<val){
                dp[mid]=val;
                break;
            }
            if(dp[mid]>val){
                e=mid-1;
            }else{
                b=mid+1;
            }
        }

    }
    cout<<res<<endl;



    return 0;
}
//409336628
#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...