RMQ

Enjoy_process發表於2018-09-10

定義

RMQ(Range Minimum/Maximum Query),即區間最值查詢,給定一個長度為N的區間,M個詢問,每次詢問Li到Ri這段區間元素的最大值/最小值

演算法

1、線段樹

2、ST表

【倍增】RMQ的ST表演算法

dp(i,j)表示以i為起點長度為2^j的區間內的最值

dp(i,j)=max(dp[i][j-1],dp[i+2^j][j-1])

答案為max(dp[l][k],dp[r-(1<<k)+1][k])

int a[N],dp[N][21];

void ST(int n)
{
	for(int i=1;i<=n;i++) dp[i][0]=a[i];
	for(int j=1;(1<<j)<=n;j++)
	  for(int i=1;i+(1<<j)-1<=n;i++)
	    dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}

//查詢陣列a的[l,r]區間的最值 【倍增】RMQ的ST表演算法
int query(int l,int r)
{
	int k=(int)(log((double)(r-l+1))/log(2.0));
	return max(dp[l][k],dp[r-(1<<k)+1][k]);
}