求助,谢谢。
#include<bits/stdc++.h>
using namespace std;
#define maxn 100001
int n,a[maxn*3],b[maxn*3];
int belong[maxn*3],f[maxn];
int cnt,sq,l[maxn*3],r[maxn*3];
int max_[maxn*3];
int ask_l(int x,int k){
int now=belong[x];
for(int i=x-1;i>=l[now];i--){
if(a[i]>=k)return x-i;
}
for(int i=now-1;i>=1;i--){
if(max_[i]>=k){
for(int j=r[i];j>=l[i];j--){
if(a[j]>=k)return x-j;
}
}
}
return -1;
}
int ask_r(int x,int k){
int now=belong[x];
for(int i=x+1;i<=r[now];i++)
if(a[i]>=k)return i-x;
for(int i=now+1;i<=cnt;i++){
if(max_[i]>=k){
for(int j=l[i];j<=r[i];i++){
if(a[j]>=k)return j-x;
}
}
}
return -1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i+n]=a[i+2*n]=a[i];
}
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
sq=sqrt(3*n);
for(int i=1;i<=n*3;i+=sq){
l[++cnt]=i;
r[cnt]=min(n*3,i+sq-1);
for(int j=l[cnt];j<=r[cnt];j++){
belong[j]=cnt;
max_[cnt]=max(max_[cnt],a[j]);
}
}
for(int i=1;i<=n;i++){
f[i]=min(ask_l(n+i,b[i]),ask_r(n+i,b[i]));
if(f[i]==n)f[i]=-1;
}
for(int i=1;i<=n;i++)printf("%d ",f[i]);
return 0;
}