Submission #1094109

#TimeUsernameProblemLanguageResultExecution timeMemory
1094109alexander707070Global Warming (CEOI18_glo)C++14
100 / 100
298 ms122020 KiB
#include<bits/stdc++.h>
#define MAXN 200007
using namespace std;
 
const long long inf=1e9;
 
struct ST{
	struct node{
		int l,r,val;
	};
 
	node tree[100*MAXN];
	int num;
	
	void init(){
		num=1;
		tree[num]={0,0,0};
	}
 
	void addnode(){
		num++;
		tree[num]={0,0,0};
	}
 
	void check(int v){
		if(tree[v].l==0){
			addnode(); tree[v].l=num;
		}
 
		if(tree[v].r==0){
			addnode(); tree[v].r=num;
		}
	}
 
	void update(int v,long long l,long long r,long long pos,int val){
		if(l==r){
			tree[v].val=max(tree[v].val,val);
		}else{
			long long tt=(l+r)/2;
			check(v);
 
			if(pos<=tt)update(tree[v].l,l,tt,pos,val);
			else update(tree[v].r,tt+1,r,pos,val);
 
			tree[v].val=max(tree[tree[v].l].val,tree[tree[v].r].val);
		}
	}
 
	int getmax(int v,long long l,long long r,long long ll,long long rr){
		if(ll>rr or v==0)return 0;
		if(l==ll and r==rr){
			return tree[v].val;
		}else{
			long long tt=(l+r)/2;
			return max( getmax(tree[v].l,l,tt,ll,min(tt,rr)) , getmax(tree[v].r,tt+1,r,max(tt+1,ll),rr) );
		}
	}
}seg[3];
 
int n,a[MAXN],ans,x;
int dp[MAXN][3];
 
int solve(){
	seg[0].init();
	seg[1].init();

	int res=0;
	for(int i=1;i<=n;i++){
		dp[i][0]=seg[0].getmax(1,0,2*inf,0,a[i]-1)+1;
		seg[0].update(1,0,2*inf,a[i],dp[i][0]);
	}

	for(int i=n;i>=1;i--){
		dp[i][1]=seg[1].getmax(1,0,2*inf,a[i]+1,2*inf)+1;
		seg[1].update(1,0,2*inf,a[i],dp[i][1]);

		res=max(res,dp[i-1][0]+seg[1].getmax(1,0,2*inf,a[i-1]-x+1,2*inf));
	}

	return res;
}
 
int main(){
 
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
 
	cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]+=inf;
	}
 
	cout<<solve()<<"\n";
 
    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...