您的位置:首页 > 其它

hdu 1166 树状数组 入门题

2010-05-02 23:35 351 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: