Submission #1333296

#TimeUsernameProblemLanguageResultExecution timeMemory
1333296fgggFinancial Report (JOI21_financial)C++20
100 / 100
1429 ms70892 KiB
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
struct st {
    vector<ll> t;
    st(ll n) {
        t.assign(4 * n, -1e18);
    }
    void upd(ll v, ll l, ll r, ll i, ll x) {
        if (l + 1 == r) {
            t[v] = x;
            return;
        }
        ll md = (l + r) >> 1;
        if (i < md) upd(2 * v + 1, l, md, i, x);
        else upd(2 * v + 2, md, r, i, x);
        t[v] = max(t[2 * v + 1], t[2 * v + 2]);
    }
    ll get(ll v, ll l, ll r, ll ql, ll qr) {
        if (l >= qr || ql >= r) return -1e18;
        if (l >= ql && r <= qr) return t[v];
        ll md = (l + r) >> 1;
        return max(get(2 * v + 1, l, md, ql, qr), get(2 * v + 2, md, r, ql, qr));
    }
};
struct nd {
    ll mx, pr, sf;
    bool all;
};
struct st2 {
    vector<nd> t;
    st2(ll n) {
        t.resize(4 * n);
        bld(0, 0, n);
    }
    void bld(ll v, ll l, ll r) {
        if (l + 1 == r) {
            t[v] = {1, 1, 1, true};
            return;
        }
        ll md = (l + r) / 2;
        bld(2 * v + 1, l, md);
        bld(2 * v + 2, md, r);
        t[v] = {r - l, r - l, r - l, true};
    }
    nd mg(const nd& cl, const nd& cr) {
        nd c;
        c.all = cl.all && cr.all;
        c.mx = max(max(cl.mx, cr.mx), cl.sf + cr.pr);
        c.pr = cl.pr;
        if (cl.all) c.pr += cr.pr;
        c.sf = cr.sf;
        if (cr.all) c.sf += cl.sf;
        return c;
    }
    void upd(ll v, ll l, ll r, ll i) {
        if (l + 1 == r) {
            t[v] = {0, 0, 0, false};
            return;
        }
        ll md = (l + r) >> 1;
        if (i < md) upd(2 * v + 1, l, md, i);
        else upd(2 * v + 2, md, r, i);
        t[v] = mg(t[2 * v + 1], t[2 * v + 2]);
    }
    nd get(ll v, ll l, ll r, ll ql, ll qr) {
        if (l >= qr || ql >= r) return {0, 0, 0, true};
        if (l >= ql && r <= qr) return t[v];
        ll md = (l + r) >> 1;
        return mg(get(2 * v + 1, l, md, ql, qr), get(2 * v + 2, md, r, ql, qr));
    }
};
void solve() {
    ll n, d;
    cin >> n >> d;
    vector<ll> a(n), b;
    for (ll& x : a) cin >> x;
    b = a;
    sort(all(b));
    b.resize(unique(all(b)) - b.begin());
    for (ll& x : a) x = lower_bound(all(b), x) - b.begin();
    vector<vector<ll>> op(n);
    for (ll i = 0; i < n; i++) op[a[i]].push_back(i);
    vector<ll> dp(n, -1e18);
    st dd(n);
    st2 d2(n);
    for (ll x = 0; x < n; x++) {
        for (ll i : op[x]) {
            dp[i] = 1;
            ll l = -1, r = i;
            while (r - l > 1) {
                ll md = (l + r) / 2;
                if (d2.get(0, 0, n, md, i).mx + 1 <= d) r = md;
                else l = md;
            }
            dp[i] = max(dp[i], dd.get(0, 0, n, r, i) + 1);
        }
        for (ll i : op[x]) {
            d2.upd(0, 0, n, i);
            dd.upd(0, 0, n, i, dp[i]);
        }
    }
    ll mx = 0;
    for (ll i = 0; i < n; i++) mx = max(mx, dp[i]);
    cout << mx;
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ll t = 1;
    //cin >> t;
    while (t--) {
        solve();
    }
}
#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...