HDU 1166 敌兵布阵 // 线段树
来源:互联网 发布:海关数据工作 编辑:程序博客网 时间:2024/06/17 20:53
题目描述
HDU 1166 敌兵布阵
解题思路
线段树的入门基础题.
题目要求支持下列操作:
1) 区间查询 (求和)
2) 单点更新 (加\减)
// 具体还是看注释哈~^ ^
参考代码
#include <stdio.h>#define lson rt<<1 // 左儿子的下标#define rson rt<<1|1 // 右儿子的下标#define mid ((l + r) >> 1) // 区间[l,r]的中点const int MAX_N = 50010;int sum[MAX_N << 2]; // 一般开最大数据量的4倍 // 把当前节点的信息更新到父节点(root, 简称 rt)void pushup(int rt){ sum[rt] = sum[lson] + sum[rson];}// 对以rt为根节点的区间[l, r]建树void build(int l, int r, int rt){ if (l == r){ // 到达叶节点 scanf("%d", &sum[rt]); return ; } build(l, mid, lson); // 左儿子区间 build(mid+1, r, rson); // 右儿子区间 pushup(rt); // 更新当前节点的信息}// 对第k个点 ( k∈[1, n] ) 进行更新(加上num) void update(int k, int num, int l, int r, int rt){ if (l == r){ // 到达叶节点 sum[rt] += num; return ; } if (k <= mid) update(k, num, l, mid, lson); // 如果k在rt的左儿子区间里, 则更新左区间 else update(k, num, mid+1, r, rson); // 否则 更新右区间 pushup(rt); }// 从以rt为根节点的区间[l, r] 中 查询 区间[L, R]int query(int L, int R, int l, int r, int rt){ if (L <= l && R >= r){ // 如果待查询区间[L, R] 完全包含 区间[l, r] 则 返回区间[l, r]所维护的信息 return sum[rt]; } int ans = 0; if (L <= mid) ans += query(L, R, l, mid, lson); // 区间[l, r] 的左儿子区间包含[L, R]的一部分 则 查询左区间 if (R > mid) ans += query(L, R, mid+1, r, rson); // 区间[l, r] 的右儿子区间包含[L, R]的一部分 则 查询右区间 return ans;}int main(){ int T, n, a, b, kase = 1; char opr[10]; scanf("%d", &T); while (T--){ scanf("%d", &n); build(1, n, 1); printf("Case %d:\n", kase++); while (scanf("%s", opr) && opr[0] != 'E'){ scanf("%d %d", &a, &b); if (opr[0] == 'Q'){ printf("%d\n", query(a, b, 1, n, 1)); }else{ b = (opr[0] == 'A' ? b : -b); update(a, b, 1, n ,1); } } } return 0;}
0 0
- HDU 1166敌兵布阵 线段树
- HDU 1166 敌兵布阵(线段树)
- 敌兵布阵 1166 HDU 线段树
- hdu 1166 敌兵布阵--线段树
- HDU 1166 敌兵布阵 线段树
- 敌兵布阵 1166 HDU 线段树
- HDU-1166-敌兵布阵(线段树)
- hdu 1166 敌兵布阵(线段树)
- hdu 1166 敌兵布阵 朴素线段树
- hdu 1166 敌兵布阵 (线段树初步)
- 线段树专题:hdu 1166敌兵布阵
- HDU 1166 敌兵布阵(线段树)
- HDU 1166敌兵布阵(线段树)
- HDU 1166 敌兵布阵 (线段树)
- 【线段树】hdu 1166 敌兵布阵
- HDU-1166 敌兵布阵 线段树
- hdu 1166 敌兵布阵 线段树
- hdu 1166 敌兵布阵(线段树)
- 【机房收费系统】——结账
- POJ2739--Sum of Consecutive Prime Numbers(尺取法)
- Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架
- 玩儿转Swift——学习笔记(持续更新)
- Python 的 Numpy SciPy MatPlotLib配置
- HDU 1166 敌兵布阵 // 线段树
- 机房收费系统之组合查询
- 【四】nginx的数据结构(2)——自己动手重写红黑树
- (转)为什么宏INT_MIN要写成-2147483647-1
- SpringMVC详细示例实战教程
- hdu 5385 The path (贪心+最短路径树)
- C++内存管理
- Docker 入门
- 断其一指------Handler消息传递机制