Submission #1306392

#TimeUsernameProblemLanguageResultExecution timeMemory
1306392SofiatpcRabbit Carrot (LMIO19_triusis)C++20
100 / 100
116 ms4848 KiB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define sc second
const int MAXN = 2*1e5+5;
int dp[MAXN], mn[MAXN*4];
pair<int,int> a[MAXN];

void build(int node, int l, int r){
    mn[node] = MAXN;
    if(l == r)return;

    int mid = (l+r)/2, e = node*2,d = node*2+1;
    build(e,l,mid); build(d,mid+1,r);
}

void update(int node, int l ,int r, int i, int x){
    if(i < l || r < i)return;
    if(l == r){
        mn[node] = x;
        return;
    }

    int mid = (l+r)/2, e = node*2,d = node*2+1;
    update(e,l,mid,i,x); update(d,mid+1,r,i,x);
    mn[node] = min(mn[e],mn[d]);
}

int query(int node, int l, int r, int i, int j){
    if(j < l || r < i)return MAXN;
    if(i <= l && r <= j)return mn[node];

    int mid = (l+r)/2, e = node*2,d = node*2+1;
    return min(query(e,l,mid,i,j),query(d,mid+1,r,i,j));
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n,m; cin>>n>>m;
    for(int i = 1; i <= n; i++){
        int x; cin>>x;
        a[i].fi = x - m*i; a[i].sc = -i;
    }
    a[n+1].fi = -m*(n+1); a[n+1].sc = -(n+1);
    sort(a,a+n+2);

    build(1,0,n+1);

    for(int id = 0; id <= n+1; id++){
        int i = -a[id].sc;

        if(i != n+1)dp[i] = query(1,0,n+1, i+1,n+1) -i-1;
        update(1,0,n+1, i, dp[i]+i);
    }
    cout<<dp[0]<<"\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...