Submission #1164973

#TimeUsernameProblemLanguageResultExecution timeMemory
1164973veliakFinancial Report (JOI21_financial)C++20
0 / 100
152 ms26272 KiB
// #define _GLIBCXX_DEBUG
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
//#pragma GCC optimize("trapv")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 

using namespace std;

template<class T> using ordered_set = __gnu_pbds::tree<T,
    __gnu_pbds::null_type,
    less<T>,
    __gnu_pbds::rb_tree_tag,
    __gnu_pbds::tree_order_statistics_node_update>;

#define int long long
#define endl '\n'
#define all(v) v.begin(), v.end()

#ifdef LOCAL
#define debug(x) cout << __LINE__ << ": " << (#x) << " = " << (x) << endl
#else
#define debug(x)
#endif

#ifdef LOCAL
#define debug_vec(x)                           \
    cout << __LINE__ << ": " << (#x) << " = "; \
    for (auto &y : x)                          \
        cout << y << " ";                      \
    cout << endl;
#else
#define debug_vec(x)
#endif


using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

auto now_rand = chrono::high_resolution_clock::now();
mt19937 rnd(now_rand.time_since_epoch().count());

const ll mod = 1e9 + 7;

struct dsu {
    vector<int> p, s, left;
    inline void init(int n) {
        p.resize(n);
        iota(all(p), 0);
        left.resize(n);
        iota(all(left), 0);
        s.assign(n, 1);
    }
    inline int leader(int x) {
        if (x == p[x])
            return x;
        return p[x] = leader(p[x]);
    }
    inline void merge(int a, int b) {
        a = leader(a);
        b = leader(b);
        if (a == b)
            return;
        if (s[a] > s[b])
            swap(a, b);
        p[a] = b;
        s[b] += s[a];
        left[b] = min(left[b], left[a]);
    }
};

const int maxn = 16;
int tree[maxn * 4];

void upd(int i, int x, int v, int l, int r) {
    if (r - l == 1) {
        tree[v] = x;
    } else {
        int mid = ((r - l) >> 1) + l;
        if (i < mid)
            upd(i, x, 2 * v + 1, l, mid);
        else
            upd(i, x, 2 * v + 2, mid, r);
        tree[v] = max(tree[2 * v + 1], tree[2 * v + 2]);
    }
}

int get(int lx, int rx, int v, int l, int r) {
    if (lx <= l && r <= rx)
        return tree[v];
    if (r <= lx || rx <= l)
        return 0;
    int mid = ((r - l) >> 1) + l;
    return max(get(lx, rx, 2 * v + 1, l, mid), get(lx, rx, 2 * v + 2, mid, r));
}

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(10);
    int n, d;
    cin >> n >> d;
    vector<int> a(n);
    for (auto& elem : a)
        cin >> elem;
    vector<int> perm(n);
    iota(all(perm), 0);
    sort(all(perm), [&a](int l, int r) {
        if (a[l] == a[r])
            return r < l;
        return a[l] < a[r];
        });
    set<int> ind;
    dsu snm;
    snm.init(n);
    for (auto const now : perm) {
        auto it = ind.lower_bound(now);
        if (it != ind.begin()) {
            auto tmp = it;
            --tmp;
            if ((now - *tmp) <= d)
                snm.merge((*tmp), now);
        }
        if (it != ind.end()) {
            auto tmp = it;
            if ((*tmp - now) <= d)
                snm.merge((*tmp), now);
        }
        ind.insert(now);
        int val = 1;
        if (snm.left[snm.leader(now)] != now) {
            val = max(val, get(snm.left[snm.leader(now)], now, 0, 0, maxn) + 1);
        }
        upd(now, val, 0, 0, maxn);
    }
    cout << get(0, maxn, 0, 0, maxn);
    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...