HDU 1166 敌兵布阵 线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
题目描述:中文题, 没啥说的, 更新+查询
解题思路:最简单的线段树, 就是套板子的题, 单点更新, 线段树的坑才刚刚开, 没啥可讲的, 就是熟悉一下线段树的板子
代码:
#include <cstdio> #define lson l, m, rt << 1 #define rson m+1, r, rt << 1 | 1 const int MAXN = 55555; int sum[MAXN<<2]; void PushUp(int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void build(int l, int r, int rt) { if( l == r ) { scanf("%d", &sum[rt]); return; } int m = (l+r)>>1; build(lson); build(rson); PushUp(rt); } void update(int p, int add, int l, int r, int rt) { if(l == r) { sum[rt] += add; return; } int m = (l+r)>>1; if(p <= m) update(p, add, lson); else update(p, add, rson); PushUp(rt); } int query(int L, int R, int l, int r, int rt) { if(L <= l && r <= R) { return sum[rt]; } int m = (l+r)>>1; int ret = 0; if( L <= m ) ret += query(L, R, lson); if( R > m ) ret += query(L, R, rson); return ret; } int main() { int T, n; scanf( "%d", &T ); for( int cas = 1; cas <= T; cas++ ) { printf( "Case %d:\n", cas ); scanf( "%d", &n ); build( 1, n, 1 ); char op[10]; while( scanf( "%s", op ) ) { if( op[0] == 'E' ) break; int a, b; scanf( "%d%d", &a, &b ); if( op[0] == 'Q' ) { printf( "%d\n", query(a, b, 1, n, 1) ); } else if( op[0] == 'S' ) update( a, -b, 1, n, 1 ); else update(a, b, 1, n, 1); } } return 0; }
思考: 刚刚参加完了陕西西安的ACM邀请赛, 拿了铜牌, 但是我觉得真的很侥幸, 因为就是快手二题, 真的是水, 所以应该开新坑, 我现在就在开线段树的新坑, 同时我要复习dp,争取对更复杂的dp有一个更加深入的了解
posted on 2017-05-24 15:58 FriskyPuppy 阅读(144) 评论(0) 编辑 收藏 举报