Submission #1130454

#TimeUsernameProblemLanguageResultExecution timeMemory
1130454VMaksimoski008Financial Report (JOI21_financial)C++17
100 / 100
962 ms80256 KiB
#include <bits/stdc++.h>
using namespace std;

struct union_find {
    int n;
    vector<int> par, size;
    vector<map<int, int> > mp;
    union_find(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;
    }
};

signed main() {
    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);
    }

    union_find 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]);
    }
    
    cout << *max_element(dp.begin(), dp.end()) << '\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...