P3865 【模板】ST表
题目背景
这是一道ST表经典题——静态区间最大值
请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1)
题目描述
给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值。
输入输出格式
输入格式:
第一行包含两个整数 N, MN,M ,分别表示数列的长度和询问的个数。
第二行包含 NN 个整数(记为 a_iai ),依次表示数列的第 ii 项。
接下来 MM 行,每行包含两个整数 l_i, r_ili,ri ,表示查询的区间为 [ l_i, r_i][li,ri]
输出格式:
输出包含 MM 行,每行一个整数,依次表示每一次询问的结果。
输入输出样例
说明
#include<iostream> #include<cstdio> #include<algorithm> #define N 100005 using namespace std; int n,m,l,r; int stmax[N][20],stmin[N][20],log2[N]; int a[N]; void init() { log2[0]=-1; for(int i=1;i<=n;i++) { log2[i]=log2[i>>1]+1; stmax[i][0]=stmin[i][0]=a[i]; } for(int j=1;j<=log2[n];j++) for(int i=1;i+(1<<j)-1<=n;i++) { stmax[i][j]=max(stmax[i][j-1],stmax[i+(1<<(j-1))][j-1]); stmin[i][j]=min(stmin[i][j-1],stmin[i+(1<<(j-1))][j-1]); } } int rmq_max(int L,int R) { int k=log2[R-L+1]; return max(stmax[L][k],stmax[R-(1<<k)+1][k]); } int rmq_min(int L,int R) { int k=log2[R-L+1]; return min(stmin[L][k],stmin[R-(1<<k)+1][k]); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); init(); while(m--) { scanf("%d%d",&l,&r); printf("%d\n",rmq_max(l,r)); } return 0; }