제출 #1341560

#제출 시각아이디문제언어결과실행 시간메모리
1341560po_rag526Rabbit Carrot (LMIO19_triusis)C++17
0 / 100
3 ms344 KiB
#include<bits/stdc++.h>
using namespace std;

int bit[800005];
int sz;

void upd(int i, int v){
    for(i++;i<=sz;i+=i&-i) bit[i]=max(bit[i],v);
}
int qry(int i){
    int r=0;
    for(i++;i>0;i-=i&-i) r=max(r,bit[i]);
    return r;
}
int qry(int l,int r){
    if(l>r) return 0;
    // prefix max BIT doesn't support range queries directly
    // use two prefix max queries won't work for range
    // use segment tree instead
    return 0;
}

struct Seg{
    vector<int> t;
    int n;
    Seg(int n):n(n),t(2*n,0){}
    void upd(int i,int v){for(t[i+=n]=max(t[i+n],v),i>>=1;i>=1;i>>=1)t[i]=max(t[2*i],t[2*i+1]);}
    int qry(int l,int r){int res=0;for(l+=n,r+=n+1;l<r;l>>=1,r>>=1){if(l&1)res=max(res,t[l++]);if(r&1)res=max(res,t[--r]);}return res;}
};

int main(){
    int n,m;
    cin>>n>>m;
    vector<int> a(n);
    for(auto& x:a) cin>>x;
    
    vector<int> vals=a;
    vals.push_back(0);
    sort(vals.begin(),vals.end());
    vals.erase(unique(vals.begin(),vals.end()),vals.end());
    int sz=vals.size();
    
    auto getIdx=[&](int v){return (int)(lower_bound(vals.begin(),vals.end(),v)-vals.begin());};
    
    Seg seg(sz);
    // height 0 is available (starting point, not a pole)
    seg.upd(getIdx(0),0);
    
    int best=0;
    for(int i=0;i<n;i++){
        int lo=a[i]-m;
        int li=0;
        if(lo>0) li=(int)(lower_bound(vals.begin(),vals.end(),lo)-vals.begin());
        int ri=getIdx(a[i]);
        int prev=seg.qry(li,ri);
        int cur=prev+1;
        best=max(best,cur);
        seg.upd(ri,cur);
    }
    
    cout<<n-best<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...