Submission #706811

#TimeUsernameProblemLanguageResultExecution timeMemory
706811amirhoseinfar1385Global Warming (CEOI18_glo)C++17
100 / 100
172 ms9292 KiB
#include<bits/stdc++.h>
using namespace std;
int n,x;
vector<int>all,allind;
int kaf=(1<<19);

struct segment{
	int seg[(1<<20)];
	segment(){
		for(int i=0;i<(1<<20);i++){
			seg[i]=0;
		}
	}
	void upd(int i,int w){
		if(i==0){
			return ;
		}
		seg[i]=max(seg[i],w);
		return upd((i>>1),w);
	}
	int pors(int i,int l,int r,int tl,int tr){
		if(l>r||l>tr||r<tl){
			return 0;
		}
		if(l>=tl&&r<=tr){
			return seg[i];
		}
		int m=(l+r)>>1;
		int d=max(pors((i<<1),l,m,tl,tr),pors((i<<1)^1,m+1,r,tl,tr));
		return d;
	}
};
segment seg;

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>x;
	all.resize(n);
	for(int i=0;i<n;i++){
		cin>>all[i];
	}
	allind=all;
	sort(allind.begin(),allind.end());
	allind.resize(unique(allind.begin(),allind.end())-allind.begin());
	vector<int>dp(n+1);
	for(int i=0;i<n;i++){
		all[i]=-all[i];
	}
	vector<int>v;
	for(int i=n-1;i>=0;i--){
		int p=lower_bound(v.begin(),v.end(),all[i])-v.begin();
		if((int)v.size()==p){
			v.push_back(all[i]);
		}
		else{
			v[p]=all[i];
		}
		dp[i]=p+1;
	//	cout<<i<<" "<<dp[i]<<"\n";
	}
	for(int i=0;i<n;i++){
		all[i]=-all[i];
	}
	int res=0;
	for(int i=0;i<n;i++){
		int p=upper_bound(allind.begin(),allind.end(),all[i]+x-1)-allind.begin();
		p--;
		int wtf=seg.pors(1,0,kaf-1,0,p);
		//cout<<i<<" "<<wtf<<" "<<dp[i]<<"\n";
		res=max(res,wtf+dp[i]);
		p=lower_bound(allind.begin(),allind.end(),all[i])-allind.begin();
		wtf=seg.pors(1,0,kaf-1,0,p-1);
		wtf++;
		seg.upd(kaf+p,wtf);
	}
	cout<<res<<"\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...