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\n", max(dmax[l][k],dmax[r-(1<<k)+1][k])-min(dmin[l][k], dmin[r - (1 << k) + 1][k]));

		}

	}

	return 0;

}

  

你可能感兴趣的:(poj)