首页 > 代码库 > [POJ 3264] Balanced Lineup [线段树]
[POJ 3264] Balanced Lineup [线段树]
题目链接
线段树的基础题,查询区间最大值和最小值,不涉及修改操作。
#include <cstdio>#include <algorithm>using namespace std;const int MAX_N = 50000 + 10;const int INF = 0x3f3f3f3f;struct Node { int l, r; int minv, maxv;} t[MAX_N << 2];int a[MAX_N], minv, maxv;void build(int o, int l, int r) { t[o].l = l; t[o].r = r; if (l == r) { t[o].minv = t[o].maxv = a[l]; return; } int mid = (l + r) >> 1; build(o << 1, l, mid); build(o << 1 | 1, mid + 1, r); t[o].maxv = max(t[o << 1].maxv, t[o << 1 | 1].maxv); t[o].minv = min(t[o << 1].minv, t[o << 1 | 1].minv);}void query(int o, int l, int r) { if (t[o].maxv <= maxv && t[o].minv >= minv) return; if (t[o].l == l && t[o].r == r) { maxv = max(maxv, t[o].maxv); minv = min(minv, t[o].minv); return; } int mid = (t[o].l + t[o].r) >> 1; if (r <= mid) query(o << 1, l, r); else if (l > mid) query(o << 1 | 1, l, r); else { query(o << 1, l, mid); query(o << 1 | 1, mid + 1, r); }}int main() { int N, Q; scanf("%d%d", &N, &Q); for (int i = 1; i <= N; i++) scanf("%d", &a[i]); build(1, 1, N); for (int i = 0; i < Q; i++) { int l, r; scanf("%d%d", &l, &r); minv = INF; maxv = -INF; query(1, l, r); printf("%d\n", maxv - minv); } return 0;}
[POJ 3264] Balanced Lineup [线段树]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。