제출 #385686

#제출 시각아이디문제언어결과실행 시간메모리
385686ritul_kr_singhGlobal Warming (CEOI18_glo)C++17
100 / 100
269 ms17712 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define nl << '\n'
#define sp << ' ' <<

struct SegmentTree{
	vector<int> a; int sz = 1, ID = -1e18;
	SegmentTree(vector<int> &v){
		while(sz < (int)v.size()) sz += sz;
		a.resize(2*sz, ID);
		build(v, 0, 0, sz);
	}
	void build(vector<int> &v, int x, int lx, int rx){
		if(rx-lx==1){
			if(lx<(int)v.size()) a[x] = v[lx];
			return;
		}
		int mx = (lx+rx)/2;
		build(v, 2*x+1, lx, mx);
		build(v, 2*x+2, mx, rx);
		a[x] = max(a[2*x+1], a[2*x+2]);
	}
	void update(int i, int val, int x, int lx, int rx){
		if(rx-lx==1) return void(a[x] = val);
		int mx = (lx+rx)/2;
		if(i<mx) update(i, val, 2*x+1, lx, mx);
		else update(i, val, 2*x+2, mx, rx);
		a[x] = max(a[2*x+1], a[2*x+2]);
	}
	void update(int i, int val){ update(i, val, 0, 0, sz); }
	int get(int l, int r, int x, int lx, int rx){
		if(r<=lx or rx<=l) return ID;
		if(l<=lx and rx<=r) return a[x];
		int mx = (lx+rx)/2;
		return max(get(l, r, 2*x+1, lx, mx), get(l, r, 2*x+2, mx, rx));
	}
	int get(int l, int r){ return get(l, r+1, 0, 0, sz); }
};

void lis(int n, vector<int> &a, vector<int> &res){
	vector<int> v = {a[0]};
	res[0] = 1;
	for(int i=1; i<n; ++i){
		if(v.back() < a[i]) v.push_back(a[i]), res[i] = v.size();
		else{
			auto f = lower_bound(v.begin(), v.end(), a[i]);
			res[i] = f - v.begin() + 1;
			*f = a[i];
		}
	}
}

signed main(){
	cin.tie(0)->sync_with_stdio(0);
	int n, x; cin >> n >> x;
	vector<int> a(n), pre(n), suf(n);
	for(int &i : a) cin >> i;

	lis(n, a, pre);
	reverse(a.begin(), a.end()); for(int &i : a) i = -i;
	lis(n, a, suf);
	reverse(a.begin(), a.end()); for(int &i : a) i = -i;
	reverse(suf.begin(), suf.end());

	// for(int i : a) cout << i << ' ';
	// cout nl;
	// for(int i : pre) cout << i << ' ';
	// cout nl;
	// for(int i : suf) cout << i << ' ';
	// cout nl;

	vector<array<int, 2>> b(n);
	vector<int> pos(n), suf1(n);
	for(int i=0; i<n; ++i) b[i] = {a[i], i};
	sort(b.begin(), b.end());
	for(int i=0; i<n; ++i) pos[b[i][1]] = i, suf1[i] = suf[b[i][1]];

	SegmentTree st(suf1);
	int ans = 1;
	
	for(int i=0; i<n; ++i){
		st.update(pos[i], -1e18);
		array<int, 2> search = {a[i]-x, (int)1e18};
		int l = upper_bound(b.begin(), b.end(), search) - b.begin();
		if(l<n){
			ans = max(ans, pre[i] + st.get(l, n-1));
		}
	}
	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...