RMQ问题

1.线段树
2.st算法
预处理\(O(nlog(n))\) 查询\(O(1)\)
具体思想倍增
原因,最小值多可怜不影响结果,所以两个区间覆盖的重复区域不影响

#include<bits/stdc++.h>
using namespace std;

const int maxn = 200000;
int d[maxn][100];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++) scanf("%d",&d[i][0]);
	for(int j = 1;(1<<j) <= n;j++){
		for(int i = 1;i+(1<<j)-1<= n;i++){
			d[i][j] = min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
		}
	}
	for(int i = 1;i <= m;i++){
		int L,R;
		scanf("%d%d",&L,&R);
		int k = 0;
		while((1<<(k+1)) <= (R-L+1)) k++;
		printf("%d ",min(d[L][k],d[R-(1<<k)+1][k]));
	}
	return 0;
}

3.树状数组

posted @ 2017-07-15 13:50  rsqppp  阅读(393)  评论(0)    收藏  举报