Submission #1346932

#TimeUsernameProblemLanguageResultExecution timeMemory
1346932vladmart09Financial Report (JOI21_financial)C++20
5 / 100
221 ms44924 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <random>
#include <queue>
#include <numeric>
#include <array>
#include <iomanip>
#include <stack>
#include <chrono>
#include <climits>

using namespace std;

using ll = long long;
using ld = long double;
using vi = vector<ll>;
using vii = vector<vi>;
using viii = vector<vii>;
using pi = pair<ll, ll>;
using vpi = vector<pi>;
using vb = vector<bool>;
using vs = vector<string>;

#define vec vector
#define cmax(x, y) x = max({x, y})
#define cmin(x, y) x = min({x, y})
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

const ll N = 3e5 + 5, MOD = 998244353, INF = (ll)1e18, K = 20, B = 836;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

ll fen[N];

void add(ll i, ll v) {
	for (; i > 0 && i < N; i -= i & -i) cmin(fen[i], v);
}

ll get(ll i) {
	ll res = INF;

	for (; i > 0 && i < N; i += i & -i) cmin(res, fen[i]);
	return res;
}

void solve() {
	ll n, d; cin >> n >> d;
	fill(fen, fen + N, INF);

	set<array<ll, 3>> st;

	ll ans = 0;

	vi a(n); for (ll& x : a) cin >> x;

	vi b = a; sort(all(b)); b.erase(unique(all(b)), b.end());

	auto get_idx = [&](ll i) {
		return 1 + lower_bound(all(b), i) - b.begin();
	};

	for (auto& x : a) x = get_idx(x);

	vi w(n);
	multiset<ll> ms;
	for (ll i = n - 1; i >= 0; i--) {
		ms.insert(a[i]);

		if (i + d + 1 < n) {
			ms.erase(ms.find(a[i + d + 1]));
		}

		w[i] = *ms.begin() - 1;
	}

	vi c(n);
	for (ll i = n - 1; i >= 0; i--) {
		add(w[i], i);
		ll res = get(a[i]);

		c[i] = res + d - 1;
	}

	for (ll i = 0; i < n; i++) {
		auto it = st.lower_bound({ a[i], -INF, -INF });

		if (it != st.end()) st.erase(it);
		it = st.lower_bound({ a[i], -INF, -INF });

		ll pos = 1;

		while (it != st.begin()) {
			it--;
			auto [f, s, t] = *it;

			if (i > s) {
				st.erase(it);
			}
			else {
				pos = t + 1;
				break;
			}

			it = st.lower_bound({ a[i], -INF, -INF });;
		}

		st.insert({ a[i], c[i], pos});
		cmax(ans, pos);
	}

	cout << ans;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	long long tt = 1;
	//cin >> tt;

	while (tt--) {
		solve();
		cout << '\n';
	}

	return 0;
}

/*



















Какие темы повторить:
1) мст
2) 2сат
3) точки артикуляции
4) ксор базис
5) эйлеровый цикл, путь
6) кмп
7) конвекс хулл
8) вафельное дерево
9) суфиксный массив
10) суффиксный автомат
11) ним

*/
#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...