洛谷 P3865 【模板】ST表

题目链接:点击这里
洛谷 P3865 【模板】ST表_第1张图片
洛谷 P3865 【模板】ST表_第2张图片

ST 表与 RMQ详细解释:点击这里

洛谷 P3865 【模板】ST表完整代码如下:

#include 
#include 
#include 
using namespace std;

int a[100010];
int f[100010][30];
int n, m, L, R;

//O(nlogn)预处理:dp(i,j) = min{dp(i,j-1), dp(i+2^(j-1),j-1)}  
//n为数组a的元素个数,k为n的二进制位数 
void init()
{
	for(int i = 1; i <= n; i++)
		f[i][0] = a[i];
	
	int k = floor(log((double)n)/log(2.0)); 		//求n的二进制位数 

	for(int j = 1; j <= k; j++)
	{
		for(int i = n; i >= 1; i--)
			if(i+(1<<(j-1)) <= n)
				f[i][j] = max(f[i][j-1], f[i+(1<<(j-1))][j-1]);
	}
}

//O(1)查询:返回区间[i,j]的最小值    
int RMQ(int i, int j)
{
    int k = floor(log((double)(j-i+1))/log(2.0));

    return max(f[i][k], f[j-(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(L,R)); 
	}
	return 0;
}

你可能感兴趣的:(ST表与RMQ)