无奖竞答:ST表

图片
好好好,只能输出9了QWQ

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100005];
int f[100005][317];
int query(int l,int r){
	int g=log2(r-l+1);
	return max(f[l][g],f[r-(1<<g)+1][g]);
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[i][0]=a[i];
	}
	int lgn=log2(n);
	for(int j=1;j<=lgn;j++){
		for(int i=1;i<=n-(1<<lgn)+1;i++){
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}
	while(m--){
		int l,r;
		cin>>l>>r;
		cout<<query(l,r)<<endl;
	}
	return 0;
}
/*

*/

@杨思越 转移式有问题

不是这样改的,应该改成

for(int i=1;i<=n-(1<<j)+1;i++)

可能就对了?(我也不清楚)

哦,看错了,好像没问题

董子豪说的是对的

TLE30pts
对的还是前三个
:roll_eyes:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100005];
int f[100005][20];
int query(int l,int r){
	int g=log2(r-l+1);
	return max(f[l][g],f[r-(1<<g)+1][g]);
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[i][0]=a[i];
	}
	int lgn=log2(n);
	for(int j=1;j<=lgn;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]);
		}
	}
	while(m--){
		int l,r;
		cin>>l>>r;
		cout<<query(l,r)<<endl;
	}
	return 0;
}
/*

*/

数组改大

为啥一样的代码,我还过了8,9两个点?

TLE了

说个有意思的事:我尝试把第四个点下下来结果把电脑卡爆了

现在多少分了?

@杨思越

我是50

30
对的还是前三个点

@杨思越 不要用函数,调用可能会耗时间

代码发过来一下?

喵喵喵数组改大

@杨思越 提醒一下,以后发东西都发到问题讨论区,一是因为常规区一小时只能发5贴我们早就超标了就算讨论问题也有可能会被禁言,二是常规区是用来水贴的地方,讨论问题本身要在问题讨论区或自己的班级区域内讨论

差不多的代码,我过了呀?

而且建议不要用log2,用数组递推

lg[1]=0
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;

我的也差不多,而且过了