【模板】ST表(RMQ)
题目背景
这是一道ST表经典题——静态区间最大值
请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为O(1)。若使用更高时间复杂度算法不保证能通过。
如果您认为您的代码时间复杂度正确但是 TLE,可以尝试使用快速读入:
1 inline int read(){ 2 int x=0,f=1;char ch=getchar(); 3 while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();} 4 while (isdigit(ch)){x=x*10+ch-48;ch=getchar();} 5 return x*f; 6 }
题目描述
给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间内数字的最大值。
输入格式
第一行包含两个整数 N,M ,分别表示数列的长度和询问的个数。
第二行包含 N 个整数(记为 ai),依次表示数列的第 i 项。
接下来 M 行,每行包含两个整数 li,ri,表示查询的区间为 [li,ri]
输出格式
输出包含 M行,每行一个整数,依次表示每一次询问的结果。
不错的BLOG
int init(){
for(int i=1;i<=n;i++) dp[0][i]=a[i];
for(int i=1;(1<<i)<=n;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
dp[i][j]=Max(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
}
}
return 0;
}
long long RMQ(long long l,long long r){
int k=floor(log2(r-l+1));
return max(dp[k][l],dp[k][r-(1<<k)+1]);
return 0;
}

浙公网安备 33010602011771号