喵哈哈村的排队

Posted 十年换你一句好久不见

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了喵哈哈村的排队相关的知识,希望对你有一定的参考价值。

http://qscoj.cn/problem/17/

描述

有一堆喵哈哈村的村民们在排队,他们从队列的尾部开始标号,标号为1的村民站在最后面,标号为n的村民站在队列的最前面,而且每个村民都拥有一个智商值a[i]。

这些村民有时候会觉得不开心,因为他们觉得凭什么一个智商比他低的人,可以站在他的前面!现在对于每个村民,他们都想知道,在他前面,智商比他低,离他最远的距离是多少。

第一行n,表示有n只咸鱼
第二行n个整数,表示每个村民的智商值a[i].
n<=200000 1<=a[i]<=1000000000

对于每个村民,输出智商比他的,且离他最远的距离是多少,如果没有输出-1

                   
6
10 8 5 3 50 45
2 1 0 -1 0 -1

      用容器来解题,在容器中,有一个好用的搜索算法lower_bound=(rbegin,rend,x)-rbegin;在规定的首元素与末尾元素之间查找第一个大于等于x的元素的位置,若没有则返回rend;
ps:upper_bound用法与之相反。

#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
const int mod=2e5+5;
long long a[mod],b[mod],i,k;
int main()
{
    long long n;
    while(cin>>n)
    {
        vector<int>v;
        vector<int>m;
        for(i=0;i<n;i++)
        {
            cin>>a[i];
        }
        for(i=n-1;i>=0;i--)
        {
            if(!v.size() || v.back()>=a[i])
            {
                b[i]=-1;
                v.push_back(a[i]);
                m.push_back(i);
            }
            else{
                k=(lower_bound(v.rbegin(),v.rend(),a[i])-v.rbegin());
                k=v.size()-k-1;
                b[i]= m[k+1]-i-1;
            }
        }
        for(i=0;i<n;i++)
        {
            if(i) cout<<‘ ‘;
            cout<<b[i];
        }
        cout<<endl;
    }
    return 0;
}

  

以上是关于喵哈哈村的排队的主要内容,如果未能解决你的问题,请参考以下文章

喵哈哈村的排队

喵哈哈村的代码传说 1——4

喵哈哈村的代码传说 第三章 宽度优先搜索

喵哈哈村的代码传说 第一章 冒泡排序

喵哈哈村的代码传说 第四章 并查集

喵哈哈村的代码传说 第四章 并查集