喵哈哈村的排队

喵哈哈村的排队

发布时间: 2017年2月26日 16:13   最后更新: 2017年2月26日 16:14   时间限制: 1000ms   内存限制: 128M

有一堆喵哈哈村的村民们在排队,他们从队列的尾部开始标号,标号为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
注意注意,多组输入把我害惨了,今天就吸取教训了
 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 #include <algorithm>
 5 #define N 200005
 6 #define mem(a) memset(a,0,sizeof(a))
 7 using namespace std;
 8 int n[N],k[N];
 9 int m;
10 int BinarySearch(int begin,int end,int x){
11     int mid,pos=0;
12     int t=begin;
13     if(begin==end)
14         return -1;
15     while(begin<end){
16         mid=(begin+end)/2;
17         if(k[mid]<x){
18             begin=mid+1;
19             pos=begin;
20         }else {
21             end=mid;
22             pos=end;
23         }
24     }
25     if(k[pos]==x&&k[pos-1]<x&&pos-1>=t)
26         return pos-1;
27     if(k[pos]==x)
28         return -1;
29     if(k[pos]<x)
30         return pos;
31     return pos-1;
32 }
33 int main(){
34     while(~scanf("%d",&m)){
35         mem(n);
36         mem(k);
37         for(int i=0;i<m;i++){
38             scanf("%d",&n[i]);
39         }
40         k[m-1]=n[m-1];
41         for(int i=m-2;i>=0;i--){
42             k[i]=min(k[i+1],n[i]);
43         }
44 
45         for(int i=0;i<m;i++){
46             int ans=BinarySearch( i,m-1,n[i]);
47             if(i)
48                 printf(" ");
49             if(ans==-1)
50                 printf("-1");
51             else
52                 printf("%d",ans-i-1);
53         }
54         printf("
");
55     }
56 
57     return 0;
58 }
 
原文地址:https://www.cnblogs.com/zllwxm123/p/7523323.html