제출 #337590

#제출 시각아이디문제언어결과실행 시간메모리
337590AzimjonGlobal Warming (CEOI18_glo)C++17
100 / 100
62 ms8556 KiB
// Muallif: Azimjon Mehmonali o'g'li

//=========================================================

//#pragma optimization_level 3
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx")
//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC optimization("unroll-loops")

//=========================================================
#ifdef DEBUG
#define xtp xtp1
#else
#define xtp(x)
#endif
//=========================================================

#include <bits/stdc++.h>

using namespace std;

#define int long long

typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<ii> vii;

#define F first
#define S second
#define pb push_back
#define endl "\n"

#define ALL(a) (a).begin(), (a).end()
#define rALL(a) (a).rbegin(), (a).rend()
#define SORT(a) sort(ALL(a))
#define rSORT(a) sort(rALL(a))
#define REV(a) reverse(ALL(a))
#define sqr(x) ((x) * (x))

#define TEZ                  \
	ios::sync_with_stdio(0); \
	cin.tie(0);

const long double PI = 3.1415926535897;
const int mod = 1000000007LL;
const int INF = 1e18;

const int N = 2e5 + 10;

signed main() {
	TEZ;

	int n, x;
	cin >> n >> x;

	vi a(n, 0);

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	vi l(n + 1, INF), d(n + 1, -INF);
	l[0] = -INF;
	int o = 0;

	for (int i = 0; i < n; i++) {
		int x = lower_bound(l.begin(), l.begin() + o + 1, a[i]) - l.begin();
		d[i] = x;
		l[x] = a[i];
		if (o < x) {
			o = x;
		}
		// xtp(l);
	}

	l.assign(n, INF);
	l[0] = -INF;
	o = 0;
	vi p(n + 1, -INF);
	for (int i = n - 1; i >= 0; i--) {
		int q
			= lower_bound(l.begin(), l.begin() + o + 1, -a[i] + x) - l.begin();
		int w = lower_bound(l.begin(), l.begin() + o + 1, -a[i]) - l.begin();

		l[w] = -a[i];
		p[i] = q;

		if (o < q) {
			o = q;
		}
		// xtp(l);
	}

	int jv = -INF;
	for (int i = 0; i < n; i++) {
		jv = max(jv, p[i] + d[i] - 1);
	}

	cout << jv << endl;

	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...