社区讨论
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 条回复,欢迎继续交流。
正在加载回复...