Submission #1131927

#TimeUsernameProblemLanguageResultExecution timeMemory
1131927ALTAKEXEFinancial Report (JOI21_financial)C++20
100 / 100
832 ms80272 KiB
#include <bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define inf INT_MAX
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define FAR(i, a, b) for (int i = (a); i >= (b); i--)
#define all(x) (x.begin(), x.end())
const int MOD = 1e9 + 7;
using namespace std;
struct UNI
{
    int n;
    vector<int> par, size;
    vector<map<int, int>> mp;
    UNI(int N) : n(N), par(n + 1), size(n + 1, 1), mp(n + 1)
    {
        for (int i = 1; i <= n; i++)
            par[i] = i;
    }
    int find(int u)
    {
        if (u == par[u])
            return u;
        return par[u] = find(par[u]);
    }
    void uni(int a, int b)
    {
        a = find(a);
        b = find(b);
        if (a == b)
            return;
        if (size[a] < size[b])
            swap(a, b);
        if (mp[a].size() < mp[b].size())
            swap(mp[a], mp[b]);
        size[a] += size[b];
        par[b] = a;
        for (auto [x, y] : mp[b])
            insert(-x, y);
    }
    void insert(int u, int v)
    {
        int p = find(u);
        auto it = mp[p].lower_bound(-u);
        if (it != mp[p].end() && it->second >= v)
            return;
        it = mp[p].insert(it, {-u, v});
        it->second = v;
        while (it != mp[p].begin() && prev(it)->second <= v)
            mp[p].erase(prev(it));
    }

    int query(int u)
    {
        int p = find(u);
        auto it = mp[p].lower_bound(-u);
        return it == mp[p].end() ? 0 : it->second;
    }
};
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, d;
    cin >> n >> d;
    vector<int> dp(n + 1, 1), a(n + 1);
    map<int, vector<int>> mp;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        mp[a[i]].push_back(i);
    }
    UNI dsu(n);
    set<int> st;
    for (auto [val, vec] : mp)
    {
        for (int p : vec)
        {
            if (!st.empty() && *st.begin() < p && p - *--st.upper_bound(p) <= d)
                dsu.uni(p, *--st.upper_bound(p));
            if (!st.empty() && *st.rbegin() > p && *st.lower_bound(p) - p <= d)
                dsu.uni(p, *st.lower_bound(p));
            dp[p] = dsu.query(p) + 1;
            st.insert(p);
        }
        for (int p : vec)
            dsu.insert(p, dp[p]);
    }
    int ans = 0;
    for (int i = 0; i < dp.size(); i++)
        ans = max(ans, dp[i]);
    cout << ans << endl;
    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...