Submission #1308126

#TimeUsernameProblemLanguageResultExecution timeMemory
1308126M_W_13Financial Report (JOI21_financial)C++20
100 / 100
558 ms37980 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define st first
#define nd second
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(a) a.begin(), a.end()
map<int, int> m;
set<int> S;
const int MAXN = 1 << 19;
int seg[2 * MAXN];
int kop[2 * MAXN];

void kopnij(int v) {
    if (kop[v] != -1) {
        seg[2 * v] = kop[v];
        kop[2 * v] = kop[v];
        seg[2 * v + 1] = kop[v];
        kop[2 * v + 1] = kop[v];
        kop[v] = -1;
    }
}

void upd(int v, int p, int k, int l, int r, int x) {
    if (l <= p && k <= r) {
        kop[v] = x;
        seg[v] = x;
    }
    else if (p > r || k < l) {

    }
    else {
        kopnij(v);
        int sr = (p + k)/2;
        upd(2 * v, p, sr, l, r, x);
        upd(2 * v + 1, sr + 1, k, l, r, x);
        seg[v] = max(seg[2 * v], seg[2 * v + 1]);
    }
}

int query(int v, int p, int k, int l, int r) {
    if (l <= p && k <= r) return seg[v];
    else if (p > r || k < l) {
        return 0;
    }
    else {
        kopnij(v);
        int sr = (p + k)/2;
        int ans = 0;
        ans = max(ans, query(2 * v, p, sr, l, r));
        ans = max(ans, query(2 * v + 1, sr + 1, k, l, r));
        seg[v] = max(seg[2 * v], seg[2 * v + 1]);
        return ans;
    }
    return 0;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, k;
    cin >> n >> k;
    int T[n];
    rep(i, n) {
        cin >> T[i];
        S.insert(T[i]);
    }
    int kt = 1;
    for (auto x: S) {
        m[x] = kt;
        kt++;
    }
    rep(i, n) {
        T[i] = m[T[i]];
        // cout << T[i] << " ";
    }
    // cout << '\n';
    int pom[n + 1];
    deque<pii> q;
    rep(i, n) {
        if (i >= (k)) {
            pom[i] = q.front().st;
        }
        else {
            pom[i] = 0;
        }
        while (!q.empty() && (q.front().nd <= (i - k))) {
            q.pop_front();
        }
        while (!q.empty() && (q.back().st >= T[i])) {
            q.pop_back();
        }
        q.push_back({T[i], i});
    }
    pom[n] = q.front().st;
    int ans = 0;
    rep(i, n) {
        if (pom[i] > 0) {
            // cout << "pom = " << pom[i] << '\n';
            upd(1, 0, MAXN - 1, 0, pom[i] - 1, 0);
        }
        int maks = query(1, 0, MAXN - 1, 0, T[i] - 1);
        // cout << "maks = " << maks << '\n';
        if (i == (n - 1)) ans = maks + 1;
        if ((maks + 1) > query(1, 0, MAXN - 1, T[i], T[i])) {
            upd(1, 0, MAXN - 1, T[i], T[i], maks + 1);
        }
    }
    upd(1, 0, MAXN - 1, 0, pom[n] - 1, 0);
    cout << query(1, 0, MAXN - 1, 0, MAXN - 1) << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...