样例全过,莫名WA,做法没错
查看原帖
样例全过,莫名WA,做法没错
344382
lmrttx楼主2021/2/28 10:38

求助,谢谢。

#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;
} 
2021/2/28 10:38
加载中...