双端队列【算法竞赛进阶指南】【pair】

本文探讨了使用双端队列解决N个整数排序问题的算法,通过按值排序并利用波谷策略,确定最少的双端队列数量以实现非降序排列。文章详细解释了算法思路和实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值