首页 > 代码库 > POJ3264 Balanced Lineup RMQ 线段树
POJ3264 Balanced Lineup RMQ 线段树
求区间内最大数和最小数的差,用两棵线段树,一个维护区间最大值,一个维护区间最小值。
#include <stdio.h> #include <vector> #include <math.h> #include <string.h> #include <string> #include <iostream> #include <queue> #include <list> #include <algorithm> #include <stack> #include <map> #include <time.h> using namespace std; #define QUADMEMSET inline void QuadMemSet(void* dst, int iSize, int value) { iSize = iSize / 4; int* newDst = (int*) dst; #ifdef WIN32 __asm { mov edi, dst mov ecx, iSize mov eax, value rep stosd } #else for (int i = 0; i < iSize;i++) { newDst[i] = value; } #endif } #define MAXN 132000 int ST[2][MAXN]; #define MAXVALUE 1000000 #define MINVALUE 0 template<class TYPE> void UpdateValue(TYPE st[],int i, TYPE value, int N, bool bMin) { i += N - 1; st[i] = value; while (i > 0) { i = (i - 1) / 2; if (bMin) { st[i] = min(st[i * 2 + 1], st[i * 2 + 2]); } else st[i] = max(st[i * 2 + 1], st[i * 2 + 2]); } } template<class TYPE> TYPE QueryST(TYPE st[], int a, int b, int l, int r, int k, bool bMin) { if (l > b || a > r) { return bMin ? MAXVALUE : MINVALUE; } if (l >= a && b >= r) { return st[k]; } else { TYPE value1 = QueryST(st, a, b, l, (r + l) / 2, k * 2 + 1, bMin); TYPE value2 = QueryST(st, a, b, (r + l) / 2 + 1, r, k * 2 + 2, bMin); if (bMin) { return min(value1, value2); } else { return max(value1, value2); } } } int main() { #ifdef _DEBUG freopen("e:\\in.txt", "r", stdin); #endif QuadMemSet(ST[0], sizeof(ST[0]), MAXVALUE); QuadMemSet(ST[1], sizeof(ST[1]), MINVALUE); int N, Q; scanf("%d %d", &N, &Q); int maxn = 1; while (maxn < N) { maxn *= 2; } for (int i = 0; i < N; i++) { int value; scanf("%d", &value); UpdateValue<int>(ST[0], i, value, maxn, true); UpdateValue<int>(ST[1], i, value, maxn, false); } for (int i = 0; i < Q;i++) { int a, b; scanf("%d %d", &a, &b); int maxr = QueryST<int>(ST[1], a - 1, b - 1, 0, maxn - 1, 0, false); int minr = QueryST<int>(ST[0], a - 1, b - 1, 0, maxn - 1, 0, true); printf("%d\n", maxr - minr); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。