제출 #1346752

#제출 시각아이디문제언어결과실행 시간메모리
1346752nathlol2Rabbit Carrot (LMIO19_triusis)C++20
100 / 100
163 ms90476 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, INF = 1e9;
int n, m, ans, a[N], dp[N];

struct sparseseg{
    struct node{
        int v;
        node *l, *r;
        node(int x): v(x), l(0), r(0){}
    };
    typedef node* pnode;
    pnode rt = 0;
    void upd(pnode &k, int l, int r, int pos, int x){
        if(!k) k = new node(INF);
        if(l == r) return k->v = x, void();
        int md = l + (r - l) / 2;
        if(pos <= md) upd(k->l, l, md, pos, x);
        else upd(k->r, md + 1, r, pos, x);
        k->v = min(k->l ? k->l->v : INF, k->r ? k->r->v : INF);
    }
    int qry(pnode k, int l, int r, int ql, int qr){
        if(!k || qr < l || r < ql) return INF;
        if(ql <= l && r <= qr) return k->v;
        int md = l + (r - l) / 2;
        return min(qry(k->l, l, md, ql, qr), qry(k->r, md + 1, r, ql, qr));
    }
}s;

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

    cin >> n >> m;
    for(int i = 1;i<=n;i++) cin >> a[i];
    s.upd(s.rt, -INF, INF, 0, 0);
    for(int i = 1;i<=n + 1;i++){
        dp[i] = s.qry(s.rt, -INF, INF, a[i] - m * i, INF) + i - 1;
        s.upd(s.rt, -INF, INF, a[i] - m * i, dp[i] - i);
    }
    cout << dp[n + 1];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...