제출 #1338727

#제출 시각아이디문제언어결과실행 시간메모리
1338727AgageldiRabbit Carrot (LMIO19_triusis)C++20
100 / 100
55 ms5880 KiB
#include <bits/stdc++.h>
using namespace std;

struct FenwickMax {
    int n;
    vector<int> bit;
    FenwickMax(int n = 0) { init(n); }
    void init(int n_) { n = n_; bit.assign(n + 1, 0); }
    void update(int idx, int val) {
        for (; idx <= n; idx += idx & -idx) bit[idx] = max(bit[idx], val);
    }
    int query(int idx) const { // max on [1..idx]
        int res = 0;
        for (; idx > 0; idx -= idx & -idx) res = max(res, bit[idx]);
        return res;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    long long M;
    cin >> N >> M;

    vector<long long> a(N + 1), t(N + 1), vals;
    vals.reserve(N);
    for (int i = 1; i <= N; i++) {
        cin >> a[i];
        t[i] = a[i] - 1LL * i * M;
        vals.push_back(t[i]);
    }

    sort(vals.begin(), vals.end());
    vals.erase(unique(vals.begin(), vals.end()), vals.end());
    int K = (int)vals.size();

    FenwickMax fw(K);
    int bestKeep = 0;

    for (int i = 1; i <= N; i++) {
        int rank = int(lower_bound(vals.begin(), vals.end(), t[i]) - vals.begin()) + 1;
        int revRank = K - rank + 1; // larger t => smaller revRank

        int bestPrev = fw.query(revRank); // previous j with t[j] >= t[i]
        int dp = 0;
        if (t[i] <= 0) dp = 1;           // start from left side directly
        if (bestPrev > 0) dp = max(dp, bestPrev + 1);

        if (dp > 0) {
            fw.update(revRank, dp);
            bestKeep = max(bestKeep, dp);
        }
    }

    cout << (N - bestKeep) << '\n';
    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...