1 solutions
-
0
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