两种方法:

(第二种也就是没注释的借鉴了题解中大佬的代码,用的vector容器中back()和pop_back())

方法一:

直接用数组模拟:数组大小开到n+1从1开始,最后一个存啾啾的可爱值。双指针l和r循环,r代表的是啾啾当前所在的位置,每次去找往r前面比啾啾可爱值更大的将其替换为啾啾,如果r<l说明越界了没找到,那就用暂存的cur_r重新赋给r。也就是啾啾不动,然后直接从当前位置到啾啾位置r-l+1就是区间长度直接结束循环,因为没有比啾啾大的了,没必要继续否则超时,如果替换成功会l++和cnt++,进入下次循环。最后输出cnt。

方法二:

直接预处理,存完元素就遍历找比啾啾大的元素下标,并存在一个vector数组b中。接着l=1,r=n+1,这里到n+1是为处理特殊情况也就是b为空,那么到末尾有n+1次因为啾啾也要等一分钟。最后每次判断b是否为空和末尾元素是否大于l,如果是就r=末尾,末尾pop,l和cnt递增。输出cnt即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve(){
    int n;
    cin>>n;
    // vector<int>a(n+2);
    // for(int i=1;i<=n;i++){
    //     cin>>a[i];
    // }
    // cin>>a[n+1];
    // int l=1,r=n+1;
    // int cnt=0;
    // while(l<=r){
    //     int cur_r=r;
    //     while(a[r]<=a[cur_r]&&l<=r){
    //         r--;
    //     }
    //     if(l<=r){
    //         a[r]=a[cur_r];
    //     }else{
    //         r=cur_r;
    //         cnt+=r-l+1;
    //         break;
    //     }
    //     l++;
    //     cnt++;
    // }
    // cout<<cnt<<endl;
    vector<int>a(n+1);
    int jiujiu;
    vector<int>b;//存储比jiujiu更可爱的位置
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    cin>>jiujiu;
    for(int i=1;i<=n;i++){
        if(a[i]>jiujiu){
            b.push_back(i);
        }
    }
    int l=1,r=n+1,cnt=0;
    while(l<=r){
        if(!b.empty()&&b.back()>=l){
            r=b.back();
            b.pop_back();
        }
        l++,cnt++;
    }
    cout<<cnt;
}

signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    solve();
    return 0;
}