CF91B Queue(单调队列+二分)

这题比较经典,我们想要求比他小的最远的点

因此我们发现,如果一个点比他前面的点大还比他近,说明这个点永远不会作为答案

因此我们就可以维护一个单调队列,之后二分找到第一个大于等于他的位置在哪,之后这个位置的前一个就是答案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=2e5+10;
const int inf=0x3f3f3f3f;
int a[N];
int ans[N];
vector<int> num,v;
int main(){
    ios::sync_with_stdio(0);
    int n;
    cin>>n;
    int i;
    for(i=1;i<=n;i++){
        cin>>a[i];
    }
    for(i=n;i>=1;i--){
        if(!v.size()||v.back()>a[i]){
            ans[i]=-1;
            v.push_back(a[i]),num.push_back(i);
        }
        else{
            int pos=lower_bound(v.rbegin(),v.rend(),a[i])-v.rbegin();
            pos=(int)v.size()-1-pos;
            if(pos==(int)v.size()-1)
                ans[i]=-1;
            else
            ans[i]=num[pos+1]-i-1;
        }
    }
    for(i=1;i<=n;i++)
        cout<<ans[i]<<" ";
    cout<<endl;

}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12803064.html