Try Again

喵哈哈村的排队

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;
}

  

posted @ 2017-03-06 17:09  十年换你一句好久不见  阅读(113)  评论(0编辑  收藏  举报