Sherry 现在碰到了一个棘手的问题,有N个整数需要排序。
Sherry 手头能用的工具就是若干个双端队列。
她需要依次处理这 N 个数,对于每个数, Sherry 能做以下两件事:
1. 新建一个双端队列,并将当前数作为这个队列中的唯一的数;
2. 将当前数放入已有的队列的头之前或者尾之后。
对所有的数处理完成之后, Sherry 将这些队列排序后就可以得到一个非降的序列。
Input第一行包含一个整数 N ,表示整数的个数。接下来的 N 行每行包含一个整数 Di ,其中 Di 表示所需处理的整数。Output
其中只包含一行,为 Sherry 最少需要的双端队列数。
Sample Input
6 3 6 0 9 6 3
Sample Output
2
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
//#include<stack>
//#include<map>
#define R(a,b,c) for(register int (a)=(b);(a)<=(c);++(a))
#define nR(a,b,c) for(register int (a)=(b);(a)>=(c);--(a))
#define Ii inline int
#define Iv inline void
#define Il inline long long
#define Ib inline bool
#define INF 0x7ffffff
#define re register
#define ll long long
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Cmin(a,b) ((a)=(a)<(b)?(a):(b))
#define Cmax(a,b) ((a)=(a)>(b)?(a):(b))
#define Fill(a,b) memset((a),(b),sizeof((a)))
#define D_e_Line printf("\n-------------\n");
#define D_e(x) printf("\n______%d_______\n",x)
#define Pause system("pause")
using namespace std;
const int N=;
Ii read(){
int s=,f=;char c;
for(c=getchar();c>''||c<'';c=getchar())if(c=='-')f=-;
while(c>=''&&c<='')s=s*+(c^''),c=getchar();
return s*f;
}
template<class Tp>Iv print(Tp x){
if(x<)putchar('-'),x=-x;
if(x>)print(x/);
putchar(x%^'');
}
#define down 0
#define up 1
struct node{
int w,id;
bool operator< (const node a)const{
if(w!=a.w)return w<a.w;
return id<a.id;
}
}a[N<<];
int mx[N],mi[N];
int main(){
int n=read(),cnt=,flag=up,tmp=INF,ans=;
R(i,,n)
a[i]=(node){read(),i};
sort(a+,a+n+);
R(i,,n)
if(i==||a[i].w!=a[i-].w)
mx[cnt]=a[i-].id,
mi[++cnt]=a[i].id;
mx[cnt]=a[n].id;
R(i,,cnt){
if(flag==down){
if(tmp>mx[i])
tmp=mi[i];
else
tmp=mx[i],flag=up;
}
else if(flag==up){
if(tmp<mi[i])
tmp=mx[i];
else
flag=down,tmp=mi[i],++ans;
}
}
print(ans);
return ;
}