题目描述
达达现在碰到了一个棘手的问题,有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;
}

 posted on 2019-07-30 22:01  谁是凶手1703  阅读(103)  评论(0)    收藏  举报