제출 #1234128

#제출 시각아이디문제언어결과실행 시간메모리
1234128justGlobal Warming (CEOI18_glo)C++20
100 / 100
38 ms4352 KiB
#include "bits/stdc++.h"
using namespace std;
 
#define vec vector
#define int long long
#define all(x) (x).begin(), (x).end()
 
const int mod = 1e9 + 7;
const int inf = 1e18;

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	int n, x; cin >> n >> x;
	vec<int> a(n);
	for (int &x: a) cin >> x;

	vec<int> lis_from(n);

	vec<int> cur; cur.reserve(n);
	for (int i = n - 1; i >= 0; i--) {
		if (cur.empty() || a[i] < cur.back()) {
			cur.push_back(a[i]);
			lis_from[i] = cur.size();
		} else {
			int l = 0, r = cur.size() - 1;
			
			int ans = r;
			while (l <= r) {
				int mid = l + (r - l) / 2;
				if (cur[mid] <= a[i]) ans = mid, r = mid - 1;
				else l = mid + 1;
			}

			cur[ans] = a[i];
			lis_from[i] = ans + 1;
		}
	}

	// for (int i = 0; i < n; i++) cerr << lis_from[i] << ' ';
	// cerr << '\n';

	int ans = 0;


	cur.clear();
	for (int i = 0; i < n; i++) {
		int q = a[i] + x;
		if (cur.empty() || q > cur.back()) ans = max(ans, lis_from[i] + (int)cur.size());
		else {
			int len = lower_bound(all(cur), q) - cur.begin();
			ans = max(ans, len + lis_from[i]);
		}

		if (cur.empty() || a[i] > cur.back()) cur.push_back(a[i]);
		else *lower_bound(all(cur), a[i]) = a[i];
	}

	cout << ans << '\n';
}
#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...