Submission #911115

#TimeUsernameProblemLanguageResultExecution timeMemory
911115oblantisGlobal Warming (CEOI18_glo)C++17
100 / 100
715 ms48820 KiB
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define all(v) v.begin(), v.end()
#define pb push_back
#define ss second
#define ff first
#define vt vector
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int, int> pii;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
const int inf = 1e9;
const int mod = 1e9+7;
const int maxn = 4e5 + 1;
int tr[maxn * 4], x, xl, xr;
int get(int v, int l, int r){
	if(xl <= l && r <= xr)return tr[v];
	if(r <= xl || xr <= l)return 0;
	return max(get(v * 2 + 1, l, (l + r) / 2), get(v * 2 + 2, (l + r) / 2, r));
}
void upd(int v, int l, int r){
	if(l + 1 == r){
		tr[v] = x;
		return;
	}
	if((l + r) / 2 <= xl)upd(v * 2 + 2, (l + r) / 2, r);
	else upd(v * 2 + 1, l, (l + r) / 2);
	tr[v] = max(tr[v * 2 + 1], tr[v * 2 + 2]);
}
void solve() {
	int n;
	cin >> n >> x;
	int t[n], p[n], sf[n];
	set<int> s;
	map<int, int> m;
	for(int i = 0; i < n; i++){
		cin >> t[i];
		p[i] = t[i] + x;
		s.insert(t[i]);
		s.insert(t[i] + x);
	}
	int cnt = 0;
	for(auto i : s)m[i] = cnt++;
	for(int i = n - 1; i >= 0; i--){
		t[i] = m[t[i]];
		p[i] = m[p[i]];
		xl = t[i] + 1, xr = maxn;
		x = get(0, 0, maxn) + 1;
		xl = t[i];
		sf[i] = x;
		upd(0, 0, maxn);
	}
	memset(tr, 0, sizeof tr);
	int ans = 0;
	for(int i = 0; i < n; i++){
		xl = 0, xr = p[i];
		x = get(0, 0, maxn) + sf[i];
		ans = max(ans, x);
		xl = 0, xr = t[i];
		x = get(0, 0, maxn) + 1;
		xl = t[i];
		upd(0, 0, maxn);
	}
	cout << ans;
}
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int times = 1;
	//cin >> times;
	for(int i = 1; i <= times; i++) {
		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...