제출 #507667

#제출 시각아이디문제언어결과실행 시간메모리
507667thiago_bastosGlobal Warming (CEOI18_glo)C++17
100 / 100
196 ms6192 KiB
#include "bits/stdc++.h"

using namespace std;

using i64 = long long;
using u64 = unsigned long long;
using i32 = int;
using u32 = unsigned;
using i16 = short;
using u16 = unsigned short;
using ld = long double;
using ii = pair<int, int>;

template<class T>
struct BIT {
	vector<T> bit;
	
	BIT() {}

	BIT(int n) {
		bit.assign(n + 1, 0);
	}
	
	void upd(int k, T x) {
		for(++k; k < int(bit.size()); k += k & -k) bit[k] = max(bit[k], x);
	}
	
	T query(int k) {
		T ans {};
		for(++k; k > 0; k -= k & -k) ans = max(ans, bit[k]);
		return ans;
	}
	
	T query(int l, int r) {
		if(l > r) return (T)0;
		return query(r) - query(l - 1);
	}
};

void solve() {	
	
	int n, x;

	cin >> n >> x;

	vector<int> a(n);

	for(int& v : a) cin >> v;

	auto p = a;
	sort(p.begin(), p.end());

	BIT<int> dp[2];
	int ans = 0;

	for(int j = 0; j < 2; ++j) {
		for(int i = 0; i < 2; ++i) dp[i] = BIT<int>(n);
		for(int i = 0; i < n; ++i) {
			int k = lower_bound(p.begin(), p.end(), a[i]) - p.begin();
			int j = upper_bound(p.begin(), p.end(), a[i] + x - 1) - p.begin() - 1;
			dp[1].upd(k, 1 + max(dp[1].query(k - 1), dp[0].query(j)));
			dp[0].upd(k, 1 + dp[0].query(k - 1));
		}
		ans = max(ans, dp[1].query(n - 1));
		for(int& v : a) v *= -1;
		for(int& v : p) v *= -1;
		reverse(p.begin(), p.end());
		reverse(a.begin(), a.end());
	}
			
	cout << ans << '\n';
}

int main() {
	ios_base :: sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	//cin >> t;
	while(t--) solve();
	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...
#Verdict Execution timeMemoryGrader output
Fetching results...