主要不会处理单谷
另maxl为单股的上一个值,type为当前上升还是下降
一定把相同的都入一个队列更优
相同的值可以任意变换下标
所以一个元素就有最小标和最大标
下降状态
maxl比当前元素的最远还远,那么当前元素都可以进去
并且只要之后的元素比当前元素的最近元素大的就必须进另一边
上升状态同理
#include<bits/stdc++.h>
using namespace std;
int n,type=0,j,ans=1;//0下降1上升
long long inf=999999999,maxl=inf;
struct node{
long long a,b;//值,以及在序列中原来的位置
}x[200005];
bool cmp(node p,node q){
if(p.a==q.a)return p.b<q.b;
return p.a<q.a;
}
/*
3 6 0 9 6 3
0 3 3 6 6 9
3 1 6 2 5 4
*/
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i].a;
x[i].b=i;
}
sort(x+1,x+1+n,cmp);
for(int i=1;i<=n;){
j=i+1;while(x[i].a==x[j].a)j++;
if(type==0&&maxl<=x[j-1].b){//处于下降
maxl=x[j-1].b;//变成上升
type=1;
}
else if(type==0&&maxl>x[j-1].b){
maxl=x[i].b;
}
else if(type==1&&maxl>=x[i].b){
maxl=x[i].b;//变成下降
type=0;
ans++;
}
else if(type==1&&maxl<x[i].b){
maxl=x[j-1].b;
}
i=j;
}
cout<<ans<<endl;
}