您的位置:首页 > 其它

HDU 1166 敌兵布阵(第一个树状数组)

2012-07-17 10:20 232 查看
题目链接

以前用普通方法150+ms 今天看了书上有这个题的详细树状数组的代码,理解下,敲敲交上居然300ms+,我正纳闷的时候,交上以前的代码TLE了。。

#include <stdio.h>
#include <string.h>
#define N 50005
int p
,n;//p[i] 就代表从i - i&(-i)+1到i的和
int lowbit(int t)//寻找低位起第一个非0位
{
return (-t)&t;//如4二进制是100所以就是4,如7二进制为111,是1
}
void insert(int t,int d)//更新某个点
{
while(t <= n)
{
p[t] += d;
t += lowbit(t);//要将含有此元素的和都更新
}
}
int getsum(int t)//求和
{
int sum = 0;
while(t > 0)
{
sum += p[t];
t -= lowbit(t);
}
return sum;
}
int main()
{
int t,i,num = 0,x,y,k;
char str[100];
scanf("%d",&t);
while(t--)
{
num ++;
memset(p,0,sizeof(p));
scanf("%d",&n);
for(i = 1;i <= n;i ++)
{
scanf("%d%*c",&k);
insert(i,k);
}
scanf("%s",str);
printf("Case %d:\n",num);
while(strcmp(str,"End") != 0)
{
scanf("%d%d%*c",&x,&y);
if(strcmp(str,"Query") == 0)
printf("%d\n",getsum(y)-getsum(x-1));
else if(strcmp(str,"Add") == 0)
insert(x,y);
else if(strcmp(str,"Sub") == 0)
insert(x,(-1)*y);
scanf("%s",str);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: