POJ-3264 Balanced Lineup RMQ(递归与非递归)

题目大意:

一个农夫有N头牛,每头牛的高度不同,我们需要找出最高的牛和最低的牛的高度差。

题解:使用RMQ,不会RMQ的可以看这个人写的点击打开链接

递归:
#include<iostream>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int ma[500005];
int mi[500005];
void build(int l, int r, int rt)
{
	if (l == r)
	{
		cin >> ma[rt];
		mi[rt] = ma[rt];
		return;
	}
	int m = (l + r) >> 1;
	build(lson);
	build(rson);
	ma[rt] = max(ma[rt << 1], ma[rt << 1 | 1]);
	mi[rt] = min(mi[rt << 1], mi[rt << 1 | 1]);
}
int rmq_max(int L, int R, int l, int r, int rt)
{
	if (L <= l && R >= r)
		return ma[rt];
	int m = (r + l) >> 1;
	int ret = 0;
	if (L <= m)
		ret = max(ret, rmq_max(L, R, lson));
	else
		if (R > m)
			ret = max(ret, rmq_max(L, R, rson));
	return ret;
}
int rmq_min(int L, int R, int l, int r, int rt)
{
	if (L <= l && R >= r)
		return mi[rt];
	int m = (r + l) >> 1;
	int ret = 100005;
	if (L <= m)
		ret = min(ret, rmq_min(L, R, lson));
	else
		if (R > m)
			ret = min(ret, rmq_min(L, R, rson));
	return ret;
}
int main()
{
	int n, m, s, e;
	cin >> n >> m;
	build(1, n, 1);
	for (int i = 1; i <= m; i++)
	{
		cin >> s >> e;
		cout << rmq_max(s, e, 1, n, 1) - rmq_min(s, e, 1, n, 1) << endl;
	}
	return 0;
}

非递归:

#include <iostream>  
#include <algorithm>  
#include <cmath>  
  
const int INF=0x3f3f3f3f;  
#define LL long long  
  
const int maxn=80000;  
const int maxm=30;  
int dp_min[maxn][maxm],dp_max[maxn][maxm],a[maxn];  
int n;  
  
void rmq_init()  
{  
    for(int i=1;i<=n;i++)  
    {  
        dp_min[i][0]=a[i];  
        dp_max[i][0]=a[i];  
    }  
    for(int j=1;(1<<j)<=n;j++)  
    {  
        for(int i=1;i+(1<<j)-1<=n;i++)  
        {  
            dp_min[i][j]=min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]);  
            dp_max[i][j]=max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j-1]);  
        }  
    }  
}  
  
int rmq_min(int l,int r)  
{  
    int k=0;  
    while((1<<(k+1))<=r-l+1) k++;  
    return min(dp_min[l][k],dp_min[r-(1<<k)+1][k]);  
}  
  
int rmq_max(int l,int r)  
{  
    int k=0;  
    while((1<<(k+1))<=r-l+1) k++;  
    return max(dp_max[l][k],dp_max[r-(1<<k)+1][k]);  
}  
  
int main()  
{  
    int q,l,r;  
    while(~scanf("%d%d",&n,&q))  
    {  
        for(int i=1;i<=n;i++)  
            cin("%d",&a[i]);  
        rmq_init();  
        while(q--)  
        {  
            cin("%d%d",&l,&r);  
            printf("%d\n",rmq_max(l,r)-rmq_min(l,r));  
        }  
    }  
    return 0;  
}  


猜你喜欢

转载自blog.csdn.net/usernamezzz/article/details/80008780