求调,一种新解法
查看原帖
求调,一种新解法
769006
crzcqh楼主2024/10/25 09:40

用的二分+st表,why WA

#include<iostream>
#define ll long long
using namespace std;
const int N=3e6+5;
int n,l,r,mid;
int a[N],log2[N],f[N][30];
int check(int l,int r){
	int k=log2[r-l+1];
	return max(f[l][k],f[r-(1<<k)+1][k]);	
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i],f[i][0]=a[i];
	for(int i=2;i<=n;i++)
		log2[i]=log2[i>>1]+1;
	for(int j=1;j<=log2[n];j++){
		for(int i=1;i<=n-(1<<j)+1;i++){
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}	
	for(int i=1;i<n;i++){
		l=i,r=n;
		while(l<r){
			mid=l+r>>1;
			//cout<<i<<' '<<mid<<' '<<check(i,mid)<<endl;
			if(check(i,mid)>a[i]){
				r=mid;
			}else{
				l=mid+1;
			}
		}
		cout<<r<<' ';
	}
	cout<<0;
	return 0;
}

2024/10/25 09:40
加载中...