社区讨论

ST表,求大佬回复

P3865【模板】ST 表 & RMQ 问题参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@miv5hydi
此快照首次捕获于
2025/12/07 11:16
2 个月前
此快照最后确认于
2025/12/09 21:40
2 个月前
查看原帖
代码
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,st[N][21],lg[N],a[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 jst(){//建ST表
    for(int i=1;i<=n;i++)
        st[i][0]=a[i];
    for(int i=1;i<=lg[n];i++)
        for(int j=1;j+(1<<i)-1<=n;j++)
            st[j][i]=max(st[j][i-1], st[j + (1<<(i-1))][i-1]);
}
int gtmx(int l,int r){
	return max(st[l][lg[r-l+1]],st[r-(1<<lg[r-l+1])+1][lg[r-l+1]]); //+1
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=2;i<=n;i++)
        lg[i]=lg[i/2]+1;
    for(int i=1;i<=n;i++)
        a[i]=read();
    jst();
    for(int i=1;i<=m;i++)
    {
        int l=read(),r=read();
        printf("%d\n",gtmx(l,r));
    }
    return 0;
}
尽管我已学了更多算法,这题我依然很纳闷:
为什么我自测+样例+测试点输出的都是正确的,但它 R E 了
而老师在另一边交上我的代码,居然AC了
老师的代码(我这边是AC)
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
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-'0';ch=getchar();}
	return x*f;
}
int n,m,a[N],f[21][N],lg2[N];
void buildst()
{
	lg2[1]=0;
	for(int i=2;i<=n;i++)
		lg2[i] = lg2[i/2] + 1; 
	for(int i=1;i<=n;i++)
		f[0][i] = a[i];
	for(int i=1;i<=lg2[n];i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
			 f[i][j] = max(f[i-1][j], f[i-1][j + (1<<(i-1))]);
}
int quer(int li, int ri)
{ 
	int d = lg2[ri-li+1]; 
	return max(f[d][li], f[d][ri - (1<<d) + 1]); 
    }
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	buildst();
	for(int i=1;i<=m;i++)
    {
		int li=read(), ri=read();
		printf("%d\n", quer(li,ri));
	}
	return 0;
}
为什么?我记得只是换了一下st表数组的写法,就过不了
求大佬解答,问题解决了必关!

回复

3 条回复,欢迎继续交流。

正在加载回复...