首页 > 代码库 > HDU 1754 I Hate It 线段树

HDU 1754 I Hate It 线段树

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

  题目描述:中文, 自己去看

  解题思路:线段树还是单点更新, 不过由之前的加和变成了最大值稍微的改动一下

  代码:

技术分享
#include <iostream>
#include <cstdio>
#include <algorithm>
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1 | 1
#define INF 0x3fffffff
using namespace std;

const int MAXN = 200020;
int MAX[MAXN<<2];

void PushUp(int rt) {
    MAX[rt] = max( MAX[rt<<1], MAX[rt<<1|1] );
}
void build(int l, int r, int rt) {
    if( l == r ) {
        scanf("%d", &MAX[rt]);
        return;
    }
    int m = (l+r)>>1;
    build(lson);
    build(rson);
    PushUp(rt);
}

void update(int p, int value, int l, int r, int rt) {
    if(l == r) {
        MAX[rt] = value;
        return;
    }
    int m = (l+r)>>1;
    if(p <= m) update(p, value, lson);
    else update(p, value, rson);
    PushUp(rt);
}

int query(int L, int R, int l, int r, int rt) {
    
    if(L <= l && r <= R) {
        return MAX[rt];
    }
    int m = (l+r)>>1;
    int ret = 0;
    if( L <= m ) ret = max( ret, query( L, R, lson) );
    if( R > m ) ret = max( ret, query(L, R, rson) );
    return ret;
}

int main() {
    
    int n, m;
    while( scanf("%d%d", &n, &m) == 2 ) {
        build( 1, n, 1 );
        while( m-- ) {
            char op[2];
            int a, b;
            scanf( "%s%d%d", op, &a, &b );
            if( op[0] == U ) {
                update(a, b, 1, n, 1);
            }
            else {
                printf( "%d\n", query(a, b, 1, n, 1) );
            }
        }
    }
    

    return 0;
}
View Code

  思考:还是线段树, 这是最基本的改动了, 要理解一个板子, 就要连最底层都了解, 我是这么认为的。

HDU 1754 I Hate It 线段树