Submission #123042

#TimeUsernameProblemLanguageResultExecution timeMemory
123042semiautoGlobal Warming (CEOI18_glo)C++14
100 / 100
656 ms9156 KiB
#include <bits/stdc++.h>
using namespace std;
int n,d,i,k,N=1,ans;
int mas[200001],num[200001],tree[530000],pdp[200001],sdp[200001];
pair <int,int> hey[200001];
int go(int x) {
    int i,pos=0;
    for (i=17;i>=0;i--) {
        if (pos+(1<<i)>n)
            continue;
        if (hey[pos+(1<<i)].first<x)
            pos+=(1<<i);
    }
    return num[hey[pos].second];
}
int gogo(int x) {
    int i,pos=0;
    for (i=17;i>=0;i--) {
        if (pos+(1<<i)>n)
            continue;
        if (hey[pos+(1<<i)].first<=x)
            pos+=(1<<i);
    }
    if (pos==n)
        return n+1;
    return num[hey[pos+1].second];
}
void update(int pos,int val) {
    pos+=N-1;
    while (pos) {
        tree[pos]=max(tree[pos],val);
        pos/=2;
    }
}
int solve(int p,int l,int r,int x,int y) {
    if (x>r || l>y)
        return 0;
    if (l>=x && r<=y)
        return tree[p];
    return max(solve(2*p,l,(l+r)/2,x,y),solve(2*p+1,(l+r)/2+1,r,x,y));
}
int main() {
    cin>>n>>d;
    while (N<n)
        N*=2;
    for (i=1;i<=n;i++) {
        cin>>mas[i];
        hey[i]={mas[i],i};
    }
    sort(hey+1,hey+n+1);
    for (i=1;i<=n;i++) {
        if (hey[i].first>hey[i-1].first)
            k++;
        num[hey[i].second]=k;
    }
    for (i=1;i<=n;i++) {
        pdp[i]=solve(1,N,2*N-1,N,N-1+num[i]-1)+1;
        update(num[i],pdp[i]);
    }
    for (i=1;i<530000;i++)
        tree[i]=0;
    for (i=n;i>0;i--) {
        sdp[i]=solve(1,N,2*N-1,N+num[i],2*N-1)+1;
        update(num[i],sdp[i]);
    }
    for (i=1;i<530000;i++)
        tree[i]=0;
    for (i=1;i<=n;i++) {
        ans=max(ans,solve(1,N,2*N-1,N,N-1+go(mas[i]+d))+sdp[i]);
        update(num[i],pdp[i]);
    }
     for (i=1;i<530000;i++)
        tree[i]=0;
    for (i=n;i>0;i--) {
        ans=max(ans,solve(1,N,2*N-1,N-1+gogo(mas[i]-d),2*N-1)+pdp[i]);
        update(num[i],sdp[i]);
    }
    cout<<ans<<endl;
  	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...