제출 #1333293

#제출 시각아이디문제언어결과실행 시간메모리
1333293fgggFinancial Report (JOI21_financial)C++20
100 / 100
738 ms42684 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));
    }
};
ll db(ll n, ll d, vector<ll> a) {
    ll ans = 0;
    vector<ll> st;
    for (ll i = n - 1; i > -1; i--) {
        while (st.size() && st.back() <= a[i]) st.pop_back();
        st.push_back(a[i]);
        ans = max(ans, (ll)st.size());
    }
    return ans;
}
void solve() {
    ll n, d;
    cin >> n >> d;
    vector<ll> a(n);
    for (ll& x : a) cin >> x;
    vector<ll> 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);
    set<pair<ll, ll>> otr, bd;
    otr.insert({0, n - 1});
    if (n + 1 >= d) bd.insert({0, n - 1});
    for (ll x = 0; x < n; x++) {
        for (ll i : op[x]) {
            dp[i] = 1;
            ll r = 0;
            if (bd.size()) {
                auto it = bd.upper_bound({i, (ll)1e18});
                if (bd.begin() != it) {
                    --it;
                    if ((*it).first == i) {
                        if (it != bd.begin()) {
                            --it;
                            r = (*it).second + 1;
                        }
                    } else {
                        if ((*it).second < i) {
                            r = (*it).second + 1;
                        } else {
                            if (i - (*it).first + 1 > d) r = i;
                            else {
                                if (it != bd.begin()) {
                                    --it;
                                    r = (*it).second + 1;
                                }
                            }
                        }
                    }
                }
            }
            dp[i] = max(dp[i], dd.get(0, 0, n, r, i) + 1);
            //cout << r << ' ' << i << ' ' << dp[i] <<  '\n';
        }
        for (ll i : op[x]) {
            dd.upd(0, 0, n, i, dp[i]);
            auto it = otr.upper_bound({i, (ll)1e18});
            assert(it != otr.begin());
            --it;
            if ((*it).first == (*it).second) {
                assert((*it).first == i);
                otr.erase(it);
                bd.erase({i, i});
                continue;
            }
            ll l = (*it).first, r = (*it).second;
            if (l == i) {
                otr.erase({l, r});
                otr.insert({l + 1, r});
                bd.erase({l, r});
                if (r - l + 1 > d) bd.insert({l + 1, r});
            } else if (r == i) {
                otr.erase({l, r});
                otr.insert({l, r - 1});
                bd.erase({l, r});
                if (r - l + 1 > d) bd.insert({l, r - 1});
            } else {
                otr.erase({l, r});
                otr.insert({l, i - 1});
                otr.insert({i + 1, r});
                bd.erase({l, r});
                if (r - (i + 1) + 2 > d) bd.insert({i + 1, r});
                if (i - 1 - l + 2 > d) bd.insert({l, i - 1});
            }
        }
        // cout << x << '\n';
        // cout << "otr" << '\n';
        // for (auto [l, r] : otr) cout << l << ' ' << r << '\n';
        // cout << "bd" << '\n';
        // for (auto [l, r] : bd) cout << l << ' ' << r << '\n';
        // cout << '\n';
    }
    ll mx = 0;
    for (ll i = 0; i < n; i++) mx = max(mx, dp[i]);
    cout << mx;
}
mt19937 rnd(52);
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    // for (ll _ = 0; _ < 1e5; _++) {
    //     ll n = rnd() % 6 + 1;
    //     vector<ll> a(n);
    //     for(ll& x : a) x = rnd() % 6 + 1;
    //     if (solve(n, 1, a) != db(n, 1, a)) {
    //         cout << n << ' ' << 1 << '\n';
    //         for (ll x : a) cout << x << ' ';
    //         cout << '\n';
    //         cout << "My" << ' ' << solve(n, 1, a) << '\n';
    //         cout << "Cor" << ' ' << db(n, 1, a);
    //         return 0;
    //     }
    // }
    //cout << solve(4, 1, {3, 5, 4, 6});
}
#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...