Submission #483317

#TimeUsernameProblemLanguageResultExecution timeMemory
483317MOUF_MAHMALATGlobal Warming (CEOI18_glo)C++14
100 / 100
1170 ms191804 KiB
#include<bits/stdc++.h>
#define all(s) s.begin(),s.end()
#define F first
#define S second
using namespace std;
typedef int ll;
const ll ee=1e9;
struct node
{
    node*l=0,*r=0;
    ll val=0;
} *lis,*lds;
ll n,k,a[200009],ans;
map<ll,vector<ll> >v;
ll best_lis(node*d,ll l,ll r,ll x)
{
    if(l>x||d==0)
        return 0;
    if(r<=x)
        return d->val;
    ll m=(l+r)/2;
    return max(best_lis(d->l,l,m,x),best_lis(d->r,m+1,r,x));
}
ll best_lds(node*d,ll l,ll r,ll x)
{
    if(r<x||d==0)
        return 0;
    if(l>=x)
        return d->val;
    ll m=(l+r)/2;
    return max(best_lds(d->l,l,m,x),best_lds(d->r,m+1,r,x));
}
void up_lis(node*d,ll l,ll r,ll id)
{
    if(l==r)
    {
        if(v[l].empty())
            d->val=0;
        else
            d->val=v[l].back();
        return;
    }
    ll m=(l+r)/2;
    if(id<=m)
    {
        if(d->l==0)
            d->l=new node;
        up_lis(d->l,l,m,id);
    }
    else
    {
        if(d->r==0)
            d->r=new node;
        up_lis(d->r,m+1,r,id);
    }
    d->val=0;
    if(d->l!=0)
        d->val=d->l->val;
    if(d->r!=0)
        d->val=max(d->val,d->r->val);
}
void up_lds(node*d,ll l,ll r,ll id,ll x)
{
    if(l==r)
        return void(d->val=x);
    ll m=(l+r)/2;
    if(id<=m)
    {
        if(d->l==0)
            d->l=new node;
        up_lds(d->l,l,m,id,x);
    }
    else
    {
        if(d->r==0)
            d->r=new node;
        up_lds(d->r,m+1,r,id,x);
    }
    d->val=0;
    if(d->l!=0)
        d->val=d->l->val;
    if(d->r!=0)
        d->val=max(d->val,d->r->val);
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    lis=new node;
    lds=new node;
    cin>>n>>k;
    for(ll i=1; i<=n; i++)
    {
        cin>>a[i];
        ll op=best_lis(lis,0,ee,a[i]-1)+1;
        v[a[i]].push_back(op);
        up_lis(lis,0,ee,a[i]);
    }
    for(ll i=n; i; i--)
    {
        v[a[i]].pop_back();
        up_lis(lis,0,ee,a[i]);
        ll op=best_lds(lds,0,ee,a[i]+1)+1;
        up_lds(lds,0,ee,a[i],op);
        op+=best_lis(lis,0,ee,a[i]+k-1);
        ans=max(ans,op);
    }
    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...