zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    R语言中的logical(0)和numeric(0)以及赋值问题
    创建hadoop用户
    虚拟机安装
    spark1-MapReduce
    arcgis1-shp转成mdb
    Actor-配置Maven
    scala6-单词计数(map(),flatMap())
    scala5-数组
    scala4-函数
    scala3-for循环
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12803064.html
Copyright © 2011-2022 走看看