[HDU]1166 敌兵布阵 (线段树--单点更新,区间求和)

来源:互联网 发布:linux dhcp安装包 编辑:程序博客网 时间:2024/05/16 07:14


题目链接
:http://acm.hdu.edu.cn/showproblem.php?pid=1166


题目大意:第一行一个整数T,表示有T组数据。每组数据第一行一个正整数N,表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人。接下来每行有一条命令,命令有4种形式:(1) Add i j,i和j为正整数,表示第i个营地增加j个人;(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人; (3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;(4)End 表示结束,这条命令在每组数据最后出现;

数据范围: 1 <= N <= 50000;1 <= ai <= 50;1 <= j <= 30;

题目解答:线段树--单点更新,区间求和(复杂度:O(M*logN),M为命令数)


#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <string>using namespace std;#define lson rt << 1, l, m#define rson rt << 1|1, m + 1, rconst int maxn = 50010;int tree[maxn<<2];    ///存树数组int lazy[maxn<<2];    ///懒惰标记int n;///区间求和pushinline void pushup(int rt){    tree[rt] = tree[rt<<1]+tree[rt<<1|1];}///建树     ///注意默认值为1 - n,有时区间要用0 - n-1,都要改void build(int rt = 1, int l = 1, int r = n){    if(l == r)    {        scanf("%d", &tree[rt]);        return;    }    int m = (l+r) >> 1;    build(lson);    build(rson);    pushup(rt);}///单点操作updatevoid update(int p, int del, int rt = 1, int l = 1, int r = n){    if(l == r)    {        tree[rt] += del;        return;    }    int m = (l+r)>>1;    if(p <= m) update(p, del, lson);    else update(p, del, rson);    pushup(rt);}///区间数值查询int query(int L, int R, int rt = 1, int l = 1, int r = n){    if(L <= l && r <= R) return tree[rt];//  if(lazy[rt]) pushdown(rt, r-l+1);    int m = (l+r)>>1, ret = 0;    if(L <= m) ret += query(L, R, lson);    if(R > m) ret += query(L, R, rson);    return ret;}char s[10];int main(){    int t, ca = 1;    scanf("%d", &t);    while(t--)    {        scanf("%d", &n);        build(1, 1, n);        printf("Case %d:\n", ca++);        while(scanf("%s", s), s[0] != 'E')        {            int l, r;            scanf("%d%d", &l, &r);            if(s[0] == 'Q')            {                printf("%d\n", query(l , r));            }            else if(s[0] == 'A')            {                update(l, r);            }            else            {                update(l, -r);            }        }    }    return 0;}


0 0
原创粉丝点击