线段树经典——HDU 1166(敌兵布阵)

来源:互联网 发布:手机应用数据备份 编辑:程序博客网 时间:2024/05/16 05:58
转引自大牛:             
                                                                                                                        NotOnlySuccess                                                                                                                            
            刚接触线段树:做一些解释,不对的地方希望大家指教
/********************************************************* maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍* lchild和rchild分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定于比较方便的表示* 以前的写法是另外开两个个数组记录每个结点所表示的区间,其实这个区间不必保存,一边算一边传下去就行,只需要写函数的时*候多两个参数,结合lchild和rchild的预定义可以很方便* PushUp(int rt)是把当前结点的信息更新到父结点* PushDown(int rt)是把当前结点的信息更新给儿子结点* rt表示当前子树的根(root),也就是当前所在的结点**********************************************************/#include <cstdio>#define lchild l , mid , rt << 1#define rchild mid + 1 , r , rt << 1 | 1const 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 mid = (l + r) >> 1;build(lchild);build(rchild);PushUP(rt);}void update(int p,int add,int l,int r,int rt) //更新函数{if (l == r) {sum[rt] += add;return ;}int mid = (l + r) >> 1;if (p <= mid) update(p , add , lchild);//小于中点,更新至左孩子else update(p , add , rchild);//大于中点,更新至右孩子PushUP(rt);//更新父结点}int query(int L,int R,int l,int r,int rt)  //重头戏,查询,分三种情况,{if (L <= l && r <= R) {return sum[rt];} int mid = (l + r) >> 1;int ret = 0;// ret为覆盖点的次数if (L <= mid) ret += query(L , R , lchild);//【L,R】被【L,mid】包含if (R > mid) ret += query(L , R , rchild);// 【L,R】被【mid+1,R】包含return ret;}int main(){    //freopen("in.txt","r",stdin);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;}




原创粉丝点击