1 solutions

  • 0
    @ 2025-11-5 17:28:21

    C++ :

    #define ABS(a) ((a)>0?(a):(-(a)))
    #define MAX(a,b) ((a)>(b)?(a):(b))
    
    #define lson l,m,t
    #define rson m+1,r,t|1
    
    #define MAXN 100010UL
    #define MAX4 400010UL
    #define MAXL 1000010UL
    
    #include <cstdio>
    
    int n,edl,edr,Min,Max,f[MAXN],tree[MAX4],mi,len,pos,t1,t2,posl,posr,new_data,data[MAXL];
    
    int Query(int l,int r,int rt){
    	if(r<l||l<1||r>mi) return 0;
    	if(posl<=l&&posr>=r){
    		return tree[rt];
    	}
    	int m=(l+r)>>1,t=rt<<1,Max_=0;
    	if(posl<=m){
    		int tp=Query(lson);
    		if(tp>Max_){
    			Max_=tp;
    		}
    	}
    	if(posr>m){
            int tp=Query(rson);
    		if(tp>Max_){
    			Max_=tp;
    		}
    	}
    	return Max_;
    }
    
    void Update(int l,int r,int rt)
    {
        if(l==r){
            tree[rt]=new_data;
            return;
        }
        int m=(l+r)>>1,t=rt<<1;
        if(pos<=m){
            Update(lson);
        }
        else{
            Update(rson);
        }
        tree[rt]=MAX(tree[t],tree[t|1]);
        return;
    }
    
    
    inline int in(){
    	int x=0;char c=getchar();
    	while(c<'0'||c>'9'){
    		c=getchar();
    	}
    	for(;c>='0'&&c<='9';c=getchar()){
    		x=x*10+c-48;
    	}
    	return x;
    }
    
    int main(){
    	n=in();
    	for(int i=1;i<=n;i++){
    		data[i]=in();
    		if(data[i]>mi){
    			mi=data[i];
    		}
    	}
    	Max=data[1];Min=data[1];edl=data[1];edr=data[1];len=1;f[data[1]]=1;new_data=1;pos=data[1];Update(1,mi,1);
    	for(int i=2;i<=n;i++){
    		if(ABS(data[i]-Max)!=1||ABS(data[i]-Min)!=1){
    			len++;f[data[i]]=len;Min=Max=data[i];
    		}
    		else{
    			posl=edl;posr=data[i]-2;
    			t1=Query(1,mi,1);
    			posl=data[i]+2;posr=edr;
    			t2=Query(1,mi,1);
    			f[data[i]]=MAX(MAX(f[data[i]],t1),t2)+1;
    			if(f[data[i]]==len){
    				if(data[i]>Max){
    					Max=data[i];
    				}
    				if(data[i]<Min){
    					Min=data[i];
    				}
    			}
    		}
    		pos=data[i];new_data=f[data[i]];
    		Update(1,mi,1);
    		if(data[i]>edr){
    			edr=data[i];
    		}
    		if(data[i]<edl){
    			edl=data[i];
    		}
    	}
    	printf("%d",len);
    	return 0;
    }
    
    
    • 1

    Information

    ID
    18461
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By