POJ 3264 Balanced Lineup RMQ

回顾一下一些基础算法,Sparse Table有种dp的感觉,写起来有点棘手吧,主要是因为下标的问题,贴一记代码,等下写一个非递归的线段树试试。

#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cmath>
#define maxn 50000
#define max_logn 20
using namespace std;

int dmin[maxn+20][max_logn];
int dmax[maxn+20][max_logn];
int a[maxn+50];
int n,m;

int main()
{
	while (cin >> n>>m)
	{
		for (int i = 1; i <= n; i++) scanf("%d", a + i);
		for (int i = 1; i <= n; i++) dmin[i][0] =dmax[i][0] = a[i];
		for (int j = 1; (1<<j) <= n; j++){
			for (int i = 0; i+(1<<j)-1 <= n; i++){
				dmin[i][j] = min(dmin[i][j - 1], dmin[i + (1<<(j-1))][j - 1]);
				dmax[i][j] = max(dmax[i][j - 1], dmax[i + (1<<(j-1))][j - 1]);
			}
		}
		int l, r;
		for (int i = 0; i < m; i++){
			scanf("%d%d", &l, &r);
			int k = 0; int len = r - l + 1;
			while ((1 << (k+1)) < len)  k++;
			printf("%d
", max(dmax[l][k],dmax[r-(1<<k)+1][k])-min(dmin[l][k], dmin[r - (1 << k) + 1][k]));
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/chanme/p/3537418.html