描述
有一堆喵哈哈村的村民们在排队,他们从队列的尾部开始标号,标号为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; }