求大佬帮助,必关!!!
查看原帖
求大佬帮助,必关!!!
1300671
Halen1happy楼主2025/1/16 10:51
#include<bits/stdc++.h>
using namespace std;
//ST表,倍增表,可以解决静态的RMQ问题
//是一种数据结构
//想要解决动态的RMO,要用树状数组或线段树
const int N=3e5+5;//inline:内联函数:可以不用跳出main之后再跳回去 
//查找区间最大值 
int n; 
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int st[N][20];

int query(int l,int r){
	int k=log2(r-l+1);
	return max(st[l][k],st[r-(1<<k)+1][k]);
}
int check(int x,int i){
	int l=1,r=n;
	while(l<r){
		int mid=(l+r)>>1;
		if(max(query(i-mid,i-1),query(i+1,i+mid))>=x){
			r=mid;
		}else{
			l=mid+1;
		}
		if(l==n){
			return -1;
		}else{
			return l;
		}
	}
}
void createST(){
	//固定区间长度,然后移动端点
	for(int i=1;i<=log2(n*3);i++){//ST表预处理
		for(int j=1;j+(1<<i)-1<=n+n+n;j++){
			st[j][i]=max(st[j][i-1],st[j+(1<<i-1)][i-1]);
		}
	}
}
int main(){
	n=read();
	for(int i=1;i<=n;i++){
		st[i][0]=st[i+n][0]=st[i+n+n][0]=read();		
	}
	//创建st表
	createST();
	for(int i=1;i<=n;i++){
		int a=read();
		int a2=check(a,i+n);
		printf("%d ",a2);
	} 
	
	
	
	return 0;
}
2025/1/16 10:51
加载中...