这题比较经典,我们想要求比他小的最远的点
因此我们发现,如果一个点比他前面的点大还比他近,说明这个点永远不会作为答案
因此我们就可以维护一个单调队列,之后二分找到第一个大于等于他的位置在哪,之后这个位置的前一个就是答案
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; const int inf=0x3f3f3f3f; int a[N]; int ans[N]; vector<int> num,v; int main(){ ios::sync_with_stdio(0); int n; cin>>n; int i; for(i=1;i<=n;i++){ cin>>a[i]; } for(i=n;i>=1;i--){ if(!v.size()||v.back()>a[i]){ ans[i]=-1; v.push_back(a[i]),num.push_back(i); } else{ int pos=lower_bound(v.rbegin(),v.rend(),a[i])-v.rbegin(); pos=(int)v.size()-1-pos; if(pos==(int)v.size()-1) ans[i]=-1; else ans[i]=num[pos+1]-i-1; } } for(i=1;i<=n;i++) cout<<ans[i]<<" "; cout<<endl; }