首页 > 其他 > 详细

CF91B Queue(单调队列+二分)

时间:2020-04-29 16:53:24      阅读:67      评论:0      收藏:0      [点我收藏+]

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

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

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

技术分享图片
#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

 

CF91B Queue(单调队列+二分)

原文:https://www.cnblogs.com/ctyakwf/p/12803064.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!