题目传送门:https://www.luogu.org/problemnew/show/P3865
题意:
有n个正整数,m次询问,每一次询问有x,y,求x到y区间的最大值。
思路:
ST表(RMQ)模板。倍增思想:每次一求出区间为1,2,4,8,16……的最大值,最后合并。
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int f[200000][20];//f[i][j]表示从i到i+(j<<1)的区间最大值
int n,m;
int main()
{
int x,y;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
f[i][0]=x;
}
int p=log2(n);
for(int j=1;j<=p;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]);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
p=log2(y-x+1);
printf("%d\n",max(f[x][p],f[y-(1<<p)+1][p]));
}
}