喵哈哈村的排队
发布时间: 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 }