【模板】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 项。

接下来 行,每行包含两个整数 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;
}

 

posted @ 2020-08-20 22:00  latent_Lin  阅读(172)  评论(0)    收藏  举报