题目描述
达达现在碰到了一个棘手的问题,有N个整数需要排序。
达达手头能用的工具就是若干个双端队列。
她需要依次处理这N个数,对于每个数,达达能做以下两件事:
1.新建一个双端队列,并将当前数作为这个队列中的唯一的数;
2.将当前数放入已有的队列的头之前或者尾之后。
对所有的数处理完成之后,达达将这些队列排序后就可以得到一个非降的序列。
请你求出最少需要多少个双端序列。
输入格式
第一行输入整数N,代表整数的个数。
接下来NN行,每行包括一个整数Di,代表所需处理的整数。
输出格式
输出一个整数,代表最少需要的双端队列数。
数据范围
1≤N≤2000001≤N≤200000
样例
输入样例:
6
3
6
0
9
6
3
输出样例:
2
思路:问有多少 谷;
先按值排序,把对应值的下标凑成波谷;
如果连续区间值都相等,求出最小下标,最大下标;与last进行比较
#include<iostream>
#include<algorithm>
#include<limits.h>
using namespace std;
const int N=200000+10;
typedef pair<int,int> pll;
pll arr[N];
int n;
// pair zhi xiaobiao;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i].first;
arr[i].second=i;
}
sort(arr,arr+n);
int last = INT_MAX, state=-1;
int ans=1;
//xiaobiao dangu;
for(int i=0;i<n;){
int p=arr[i].first;
int j=i;
while(j<n && arr[j].first == p) j++;
int minp=arr[i].second,maxp=arr[j-1].second;
// i=值,,,j=下标
if(state== -1){
if(last> maxp ){
last = minp;
}
else{
state=1;
last = maxp;
}
}
else if((state == 1)){
if(last<minp) last=maxp;
else{
ans++;
state=-1;
last = minp;
}
}
i=j;
}
cout<<ans<<endl;
return 0;
}