T5 奶牛排队 TLE10 求调

#include<bits/stdc++.h>
using namespace std;
long long a[100005],n;
int st_minn[100005][21],st_maxx[100005][21];
int fmax(int c,int d){
	if(a[c]>a[d]||(a[c]==a[d]&&c<d)) return c;
	return d;
}
int fmin(int c,int d){
	if(a[c]<a[d]||(a[c]==a[d]&&c>d)) return c;
	return d;
}
void init(){
	for(int i=1;i<=n;i++) st_minn[i][0]=st_maxx[i][0]=i;
	int t=log2(n);
	for(int j=1;j<=t;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			st_minn[i][j]=fmin(st_minn[i][j-1],st_minn[i+(1<<(j-1))][j-1]);
			st_maxx[i][j]=fmax(st_maxx[i][j-1],st_maxx[i+(1<<(j-1))][j-1]);	
		}
	}
	return;
}
int ans=0;
void fen(int l,int r){
	if(l>=r||ans>=r-l+1) return;
	int ke=log2(r-l+1);
	int he=1<<ke;
	int l1=fmin(st_minn[l][ke],st_minn[r-he+1][ke]);
	int r1=fmax(st_maxx[l][ke],st_maxx[r-he+1][ke]);
	if(l1==r1){
		if(ans<r1-l1+1) ans=r1-l1+1;
		fen(l,l1-1);
		fen(r1+1,r);
		return;
	}
	else{
		fen(l,r1);
		fen(l1+1,r1-1);
		fen(l1,r);
		return;
	}

}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	init();
	fen(1,n);
	cout<<ans;
	return 0;
}

题目链接

多少分,哪个点错了?


TLE10

ber,你的题面去哪里了

题目链接没用的会403,我又不是你们班的

1.fen(l1+1,r1-1);这个应该改成 fen(r1+1,l1-1);
2.当 l1==r1 时应该 return,并且这个:

if(l1==r1){
		if(ans<r1-l1+1) ans=r1-l1+1;
		fen(l,l1-1);
		fen(r1+1,r);
		return;
	}

改成这个:

if(l1<r1){
		if(ans<r1-l1+1) ans=r1-l1+1;
		fen(l,l1-1);
		fen(r1+1,r);
		return;
	}
1 个赞