Hdu 1754 I Hate It

线段树  单点更新


Exe.Time:2125MS 和 Exe.Memory:6360K 让我很伤心!



线段树功能:

Build 构建线段树

Update 替换某一点的值

Query 区间求最大值



注意:

在输入操作类型U或者Q时,注意字符输入处理。



AC代码:

#include <stdio.h>
#include <string.h>
#include <math.h>

using namespace std;

#define MAXN 200005

struct SegmentTree {
    int l;
    int r;
    int Max;
}a[MAXN*3];

int get_max(int a, int b) {
    return a>b?a:b;
}

void Build(int s, int t, int rt) {
    a[rt].l = s;
    a[rt].r = t;
    a[rt].Max = -1;
    int mid = (a[rt].l+a[rt].r)/2;
    if(s == t) return ;
    Build(s, mid, rt*2);
    Build(mid+1, t, rt*2+1);
}

void Update(int i, int tmp, int rt) {
    if(a[rt].l == a[rt].r && a[rt].l == i) {
        a[rt].Max = tmp;
        return ;
    }
    int mid = (a[rt].l+a[rt].r)/2;
    if(i <= mid) Update(i, tmp, rt*2);
    else Update(i, tmp, rt*2+1);
    a[rt].Max = get_max(a[rt*2].Max, a[rt*2+1].Max);
}

int ans;
void Query(int l, int r, int rt) {
    if(a[rt].l == l && a[rt].r == r) {
        ans = get_max(a[rt].Max, ans);
        return ;
    }
    int mid = (a[rt].l+a[rt].r)/2;
    if(r <= mid) Query(l, r, rt*2);
    else if(l > mid) Query(l, r, rt*2+1);
    else {
        Query(l, mid, rt*2);
        Query(mid+1, r, rt*2+1);
    }
}

int main() {
    int n, m,
        x, a, b;
    char c[3];
    while(scanf("%d%d", &n, &m)!=EOF) {
        Build(1, n, 1);
        for(int i = 1; i <= n; i++) {
            scanf("%d", &x);
            Update(i, x, 1);
        }
        for(int i = 0; i < m; i++) {
            scanf("%s%d%d", c, &a, &b);
            if(c[0] == 'U') {
                Update(a, b, 1);
            }
            else {
                if(a > b) {
                    int t;
                    t = a;
                    a = b;
                    b = t;
                }
                ans = 0;
                Query(a, b, 1);
                printf("%d\n", ans);
            }
        }
    }
    return 0;
}



你可能感兴趣的:(Hdu 1754 I Hate It)