hdu 1166 树状数组 入门题

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

对于详细的树状数组的介绍 可以百度 有很多相关的资料 

#include < iostream >
using   namespace  std;

const   int  maxn  =   50010 ;
// long data[maxn];
long  result[maxn];
long  n;
int  Lowbit( int  t)
{
     // return t & ( t ^ ( t - 1 ) );
     return  ( - t) & t;
}

int  Sum( int  end)
{
     long  sum  =   0 ;
     while (end  >   0 )
    {
        sum  +=  result[end];
        end  -=  Lowbit(end);
    }
     return  sum;
}
void  plus( int  pos ,  int  num)
{
     while (pos  <=  n)
    {
        result[pos]  +=  num;
        pos  +=  Lowbit(pos);
    }
}
int  main()
{
     // freopen("out.txt","w",stdout);
     int  casenum,i,case1,a,b;
     long  num;
     char  str[ 100 ];
    cin >> casenum;
    case1  =   1 ;
     while (casenum -- )
    {
         // memset(data,0,sizeof(data));
        memset(result, 0 , sizeof (result));
        cin >> n;
         for (i  =   1 ; i  <=  n;i ++ ) // 树状数组初始化
        {
            cin >>  num;
            plus(i,num);
        }
    
        printf( " Case %d:/n " ,case1);
         while (cin >> str,strcmp(str, " End " ) != 0 )
        {
            cin >> a >> b;    
            
            
             if (strcmp(str, " Query " ) == 0 )
                printf( " %ld/n " ,Sum(b)  -  Sum(a - 1 ));
             else   if (strcmp(str, " Add " ) == 0 )
                plus(a,b);
             else   if (strcmp(str, " Sub " ) == 0 )
                plus(a, 0 - b);
        }
        case1  ++ ;
    }
     return   0 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值