题目大意:
一个农夫有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; }