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; }
思考:还是线段树, 这是最基本的改动了, 要理解一个板子, 就要连最底层都了解, 我是这么认为的。
posted on 2017-05-24 20:06 FriskyPuppy 阅读(148) 评论(0) 编辑 收藏 举报