HDU 1754:I Hate It(线段树-单点更新)

题意:

1~N这些人有一些分数,之后有M条操作。要求支持两种操作:更新其中某个人的成绩,查询[A,B]区间内的人的最高成绩。 ( 0<N<=200000,0<M<5000 )

思路:

简单线段树。

Just Do it.

写这个仅仅是为了有一个模板。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 200020
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1


int tree[N<<2];

void pushUp(int rt) {
    tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
}

void build(int l, int r, int rt) {
    if (l == r) {
        scanf("%d", &tree[rt]);
        return;
    }
    int mid = (l+r)/2;
    build(lson);
    build(rson);
    pushUp(rt);
}

int query(int L, int R, int l, int r, int rt) {
    if (L <= l && r <= R) {
        return tree[rt];
    }
    int mid = (l+r)/2;
    int ans = 0;
    if (L <= mid) ans = max(ans, query(L,R,lson));
    if (R > mid) ans = max(ans, query(L,R,rson));
    return ans;
}

void update(int pos, int v, int l, int r, int rt) {
    if (l == r) {
        tree[rt] = v;
        return;
    }
    int mid = (l+r)/2;
    if (pos <= mid) update(pos, v, lson);
    if (pos > mid) update(pos, v, rson);
    pushUp(rt);
}

int main() {
    int n ,m;
    while (scanf("%d%d", &n, &m) != EOF) {
        build(1,n,1);
        char com[30];
        for (int i = 0; i < m; i++) {
            int a, b;
            scanf("%s%d%d", com, &a, &b);
            if (com[0] == 'U') {
                update(a,b,1,n,1);
            }
            if (com[0] == 'Q') {
                printf("%d
", query(a,b,1,n,1));
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shinecheng/p/3601884.html