• hdu 1166 树状数组(模板) 更改点值+求区间和


    题目来源:

    http://acm.hdu.edu.cn/showproblem.php?pid=1166

    代码如下:

    using namespace std ;
    typedef long long LL;
    const int Max_N=50010;
    int cc[Max_N]; // 树状数组,有ci = A(i-lowbit(i)+1) + A(i-lowbit(i)+2)+ Ai
    int n;// 数组A的个数,下标从1开始
    int lowbit(int x){//lowbit 求的是 x的二进制表达式中最右边的1所对应的值
        return x & -x;
    }
    void Add(int x, int value){// 数组元素Ax增加value值,需要修改的cc[]
        while(x<=n){
            cc[x]+=value;
            x+=lowbit(x);
        }
    }
    int Sum(int x){// 下标从1开始,到n, sum求的是 A1+A2+...+Ax之和
        int ret=0;
        while(x > 0)
        {
            ret+=cc[x];
            x-=lowbit(x);
        }
        return ret;
    }
    int Getsum(int x1, int x2){ // 区间和
        return Sum(x2)-Sum(x1-1);
    }
    void init(){ //复杂度为 n(logn) ,初始化树状数组
        int tmp;
        memset(cc,0,sizeof(cc));
        for(int i=1; i<=n ;i++){
                scanf("%d",&tmp);
                 Add(i,tmp);
            }
    }
    int main(){
        int t,a,b,k=1;
        char s[10];
        scanf("%d",&t);
        while(t--){
            printf("Case %d:
    ",k++);
            scanf("%d",&n);
            init();
            while(scanf("%s",s)){
                if(!strcmp(s,"End"))
                    break;
                scanf("%d%d",&a,&b);
                if( !strcmp(s,"Query") )
                    printf("%d
    ",Getsum(a,b));
                else if( !strcmp(s,"Add") )
                    Add(a,b);
                else
                    Add(a,-b);
            }
        }
        return 0;
    }
  • 相关阅读:
    软件开发过程须贯彻评估和测试
    【灌水】多维成功论
    改进c系列(目录)
    网站管理艺术
    .net 跨平台也是一句谎言
    用户界面和逻辑应该分离
    设计模式
    程序员找不到工作是因为管理差
    编码阶段
    保证软件开发质量的一种管理学
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3652848.html
Copyright © 2020-2023  润新知