Balanced Lineup POJ

来源:互联网 发布:数据库闩定 编辑:程序博客网 时间:2024/06/02 02:23

链接:http://poj.org/problem?id=3264

题意:n个牛m个操作,问你第[i, j]之间最高的牛和最低的牛的高度差是多少

解题思路: 保存最大值最小值就可以了, 模板稍微改改就可以

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <math.h>#define LL long long#define lson ins<<1#define rson ins<<1|1#define mid (l+r)/2const int Max = 51000;using namespace std;struct node {    int l, r;    int sum, max1, min1, lazy;} tree[Max << 2];int data[Max << 2];void push_up(int ins) {    tree[ins].max1 = max(tree[lson].max1, tree[rson].max1);    tree[ins].min1 = min(tree[lson].min1, tree[rson].min1);}void build(int l, int r, int ins) {    tree[ins].l = l, tree[ins].r = r, tree[ins].sum = tree[ins].max1 = tree[ins].min1 = 0;    if (l == r) {        tree[ins].min1 = tree[ins].max1 = data[l];    } else {        build(l, mid, lson);        build(mid + 1, r, rson);        push_up(ins);    }}int ans1, ans2;void query(int ql, int qr, int ins) {    int l = tree[ins].l, r = tree[ins].r;    if (l >= ql && r <= qr) {        ans1 = max(ans1, tree[ins].max1);        ans2 = min(ans2, tree[ins].min1);    } else {        if (ql <= mid)query(ql, qr, lson);        if (qr > mid)query(ql, qr, rson);    }}int main() {    int n, m;    while (~scanf("%d%d", &n, &m)) {        for (int a = 1; a <= n; a++) {            scanf("%d", &data[a]);        }        build(1, n, 1);        for (int a = 1; a <= m; a++) {            int i, j;            ans1 = 0;            ans2 = (int) 1e9;            scanf("%d%d", &i, &j);            query(i, j, 1);            printf("%d\n", ans1 - ans2);        }    }    return 0;}
原创粉丝点击