莫名RE
查看原帖
莫名RE
364254
njwsnjws楼主2021/7/3 15:15
//
#include <bits/stdc++.h>
#define INF 0x7f7f7f7f
using namespace std;

const int maxn=300030,maxl=40;
int a[maxn],b[maxn],lg[maxn];
int f[maxn][maxl];
int n;

void breakdown(){
	for(int i=0; i<n; i++)a[i+n+n]=a[i+n]=a[i];
	for(int i=0; i<n; i++)b[i+n+n]=b[i+n]=b[i];
}

void STinit(){
	for(int i=2; i<maxn; i++)lg[i]=lg[i/2]+1;
	
	for(int i=0; i<n+n+n; i++)f[i][0]=a[i];
	for(int j=1; j<=lg[n*3]; j++){
		for(int i=0; i<n+n+n; i++){
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}
}

int quest(int l,int r){
	int len=lg[r-l+1];
	return max(f[l][len],f[r-(1<<len)+1][len]);
}

int main()
{
	cin>>n;
	for(int i=0; i<n; i++)cin>>a[i];
	for(int i=0; i<n; i++)cin>>b[i];
	
	breakdown();
	STinit();
	
	for(int i=n; i<2*n; i++){
		int l,r;
		int mina=INF;
		//from i-1 to i-n/2
		l=i-n/2,r=i-1;
	//	cout<<quest(l,r)<<endl;
		if(quest(l,r)>=b[i]){
			while(l<r){
				//cout<<l<<"-"<<r<<endl;
				int mid=(l+r)/2+1;
				if(quest(mid,i-1)<b[i])r=mid-1;
				else l=mid;
			}
		//	cout<<i<<":"<<l<<endl;
			mina=min(mina,i-l);
		}
		//cout<<mina<<endl;
		 
		//from i+1 to i+n/2
		l=i+1,r=i+n/2;
		if(quest(l,r)>=b[i]){
			while(l<r){
				int mid=(l+r)/2;
				if(quest(i+1,mid)<b[i])l=mid+1;
				else r=mid;
			}
			mina=min(mina,l-i);
		} 
			
		if(mina==INF)cout<<-1<<" ";
		else cout<<mina<<" ";
	}cout<<endl;

	return 0;
}


2021/7/3 15:15
加载中...