您的位置:首页 > 其它

POJ 3264 Balanced Lineup

2013-03-20 22:21 381 查看
大意略。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;

const int maxn = 50010;
const int maxd = 17; // log10(50010) / log10(2);

int n, m;

int A[maxn];

int minv[maxn][maxd], maxv[maxn][maxd];

void RMQ_init()
{
	for(int i = 1; i <= n; i++)
	{
		minv[i][0] = A[i];
		maxv[i][0] = A[i];
	}
	for(int j = 1; (1<<j) <= n; j++)
	{
		for(int i = 1 ; i+(1<<j)-1 <= n; i++)
		{
			minv[i][j] = min(minv[i][j-1], minv[i+(1<<(j-1))][j-1]);
			maxv[i][j] = max(maxv[i][j-1], maxv[i+(1<<(j-1))][j-1]);
		}
	}
}

int RMQ(int L, int R)
{
	int k = 0;
	while(1<<(k+1) <= R-L+1) k++;
	int a = min(minv[L][k], minv[R-(1<<k)+1][k]);
	int b = max(maxv[L][k], maxv[R-(1<<k)+1][k]);
	return b-a;
}

void read_case()
{
	for(int i = 1; i <= n; i++) scanf("%d", &A[i]);
	RMQ_init();
}

void solve()
{
	read_case();
	while(m--)
	{
		int L, R;
		scanf("%d%d", &L, &R);
		int ans = RMQ(L, R);
		printf("%d\n", ans);
	}
}

int main()
{
	while(~scanf("%d%d", &n, &m))
	{
		solve();
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: