제출 #244757

#제출 시각아이디문제언어결과실행 시간메모리
244757eohomegrownappsGlobal Warming (CEOI18_glo)C++14
100 / 100
151 ms13304 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Fenwick{
	vector<ll> arr;
	ll n;
	bool startFromLeft;
	Fenwick(ll _n, bool _startFromLeft){
		//0 to n-1 inclusive
		startFromLeft = _startFromLeft;
		n=_n;
		arr.resize(n+1);
	}

	ll conv(ll ind){
		ind+=1;
		if (!startFromLeft){
			ind=n+1-ind;
		}
		return ind;
	}

	void update(ll ind, ll val){
		ind = conv(ind);
		while (ind<=n){
			arr[ind]=max(arr[ind],val);
			ind+=ind&(-ind);
		}
	}

	ll query(ll ind){
		ind = conv(ind);
		ll val = 0;
		while (ind>0){
			val=max(val,arr[ind]);
			ind-=ind&(-ind);
		}
		return val;
	}
};

vector<ll> vals;
vector<ll> mp;

vector<ll> lisl;
vector<ll> lisr;

int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	ll n,d;
	cin>>n>>d;
	vals.resize(n);
	mp.resize(n);
	for (ll i = 0; i<n; i++){
		cin>>vals[i];
		mp[i]=vals[i];
	}
	sort(mp.begin(),mp.end());
	mp.erase(unique(mp.begin(),mp.end()),mp.end());
	for (ll i = 0; i<n; i++){
		vals[i]=lower_bound(mp.begin(),mp.end(),vals[i])-mp.begin();
	}
	
	Fenwick *fenl = new Fenwick(n+1, true);
	lisl.resize(n,0);
	for (ll i = 0; i<n; i++){
		//cout<<vals[i]<<'\n';
		ll mxprev = fenl->query(vals[i]);
		lisl[i]=mxprev+1;
		fenl->update(vals[i]+1,lisl[i]);
	}

	Fenwick *fenr = new Fenwick(n+1, false);
	lisr.resize(n,0);
	ll mx = 0;
	for (ll i = n-1; i>=0; i--){
		//cout<<vals[i]<<'\n';
		ll mxprev = fenr->query(vals[i]+1);
		lisr[i]=mxprev+1;
		fenr->update(vals[i],lisr[i]);
		mx=max(mx,lisr[i]);
	}

	Fenwick *leftdat = new Fenwick(n+1, true);
	
	for (ll i = 0; i<n; i++){
		//use item i in rhs of lis
		//how far above can we go?
		//cout<<"find "<<mp[vals[i]]+d-1<<'\n';
		ll mxup = lower_bound(mp.begin(),mp.end(),mp[vals[i]]+d)-mp.begin()-1;
		//if (mxup==mp.size()){mxup--;}
		ll mxval = leftdat->query(mxup);
		//cout<<mxup<<' '<<mxval<<' '<<lisr[i]<<' '<<mxval+lisr[i]<<'\n';
		mx=max(mx,mxval+lisr[i]);
		leftdat->update(vals[i],lisl[i]);
		//cout<<mx<<'\n';
	}
	cout<<mx<<'\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...