题目链接:数列区间
分析
RMQ模板。
st表预处理出
i
−
i
+
2
j
i-i+2^j
i−i+2j的最大值,然后设
k
=
l
o
g
2
(
x
−
y
+
1
)
k=log2(x-y+1)
k=log2(x−y+1)
最后输出查询两段长为2k的序列最值(可以重叠)
上代码
cin什么东西啊真是lj
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,a[100001],f[1000010][21],lg[100001];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
f[i][0]=a[i];
}
lg[0]=-1;
for(int i=1;i<=n;i++)
{
lg[i]=lg[i>>1]+1;
}
for(int j=1;j<=lg[n];j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
int k=lg[y-x+1];
printf("%d\n",max(f[x][k],f[y-(1<<k)+1][k]));
}
return 0;
}
scanf真香