HDU 1754 I Hate it 线段树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1754
题目大意: 给一串儿数, 要求求出区间最大值
解题思路: 同样是最基础的东西, 单点更新和查询
代码:
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <map> #include <cstring> #include <iterator> #include <cmath> #include <algorithm> #include <stack> #include <deque> #include <map> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 const int maxn = 200000+7; using namespace std; int tree[4*maxn]; int arr[maxn]; char op[10]; void pushPlus( int rt ) { tree[rt] = max( tree[rt<<1], tree[rt<<1|1] ); } void build( int l, int r, int rt ) { if( l == r ) { tree[rt] = arr[l]; return; } int m = (l + r) >> 1; build(lson); build(rson); pushPlus(rt); } int Query( int L, int R, int l, int r, int rt ) { if( L <= l && R >= r ) { return tree[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; } void Update( int p, int add, int l, int r, int rt ) { if( l == r ) { tree[rt] = add; return; } int m = (l + r) >> 1; if( p <= m ) Update(p, add, lson ); else Update(p, add, rson ); pushPlus(rt); } int main() { int n, mm; while( scanf( "%d%d", &n, &mm ) == 2 ) { for( int i = 1; i <= n; i++ ) { scanf( "%d", &arr[i] ); } build(1, n, 1); for( int j = 1; j <= mm; j++ ) { int a, b; scanf( "%s%d%d", op, &a, &b ); getchar(); if( op[0] == 'Q' ) { printf( "%d\n", Query(a, b, 1, n, 1) ); } else { Update( a, b, 1, n, 1 ); } } } }
思考: 有时候看着挺简单但是写着还是需要一定时间的, 上次写这道题的时候我是直接抄的板子, 这次我是自己写的, 该练练自己的代码能力了
posted on 2017-08-04 16:10 FriskyPuppy 阅读(149) 评论(0) 编辑 收藏 举报