제출 #1309515

#제출 시각아이디문제언어결과실행 시간메모리
1309515comet0Global Warming (CEOI18_glo)C++20
100 / 100
135 ms7508 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct BIT {
	int n;
	vector<int> bit;
	BIT(int n=0): n(n), bit(n+1, 0) {}
	void reset(int n_) { n = n_; bit.assign(n+1, 0); }
	void update(int i, int val) {
		for (; i <= n; i += i & -i) bit[i] = max(bit[i], val);
	}
	int query(int i) const {
		int res = 0;
		for (; i > 0; i -= i & -i) res = max(res, bit[i]);
		return res;
	}
};

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int n;
	ll x;
	if (!(cin >> n >> x)) return 0;
	vector<ll> a(n);
	for (auto& v : a) cin >> v;

	vector<ll> b = a;
	sort(b.begin(), b.end());
	b.erase(unique(b.begin(), b.end()), b.end());
	int m = b.size();

	auto id = [&](ll v) {
		return int(lower_bound(b.begin(), b.end(), v) - b.begin()) + 1;
	};

	vector<int> l(n), r(n);
	BIT f(m);
	for (int i = 0; i < n; i++) {
		int p = id(a[i]);
		l[i] = f.query(p - 1) + 1;
		f.update(p, l[i]);
	}

	BIT g(m);
	for (int i = n - 1; i >= 0; i--) {
		int p = id(a[i]);
		int q = m - p + 1;
		r[i] = g.query(q - 1) + 1;
		g.update(q, r[i]);
	}

	int ans = 0;
	for (int v : l) ans = max(ans, v);

	BIT h(m);
	for (int j = 0; j < n; j++) {
		ll t = a[j] + x;
		int p = int(lower_bound(b.begin(), b.end(), t) - b.begin());
		int s = h.query(p);
		ans = max(ans, s + r[j]);
		h.update(id(a[j]), l[j]);
	}

	cout << ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...