题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1166
hdu1166 敌兵布阵
树状数组的第一道题,实质就是copy学长的代码,鄙视一下自己
#include
#include
using namespace std;
const int num=50005;
int n,bit[num];
int lowbit(int a)
{
return a&(-a);
}
void init()
{
int i;
for(i=1;i<=n;i++)
bit[i]=0;
}
void updata(int x,int add)
{
while(x<=n)
{
bit[x]+=add;
x+=lowbit(x);
}
}
int sum(int a)
{
int ans=0;
while(a>0)
{
ans+=bit[a];
a-=lowbit(a);
}
return ans;
}
int main()
{
int t,i,k,a,b;
char s[10];
//freopen("in.txt","r",stdin);
scanf("%d",&t);
for(k=1;k<=t;k++)
{
scanf("%d",&n);
init();
for(i=1;i<=n;i++)
{
scanf("%d",&a);
updata(i,a);
}
printf("Case %d:\n",k);
while(scanf("%s",s))
{
if(strcmp(s,"End")==0)
break;
else if(strcmp(s,"Add")==0)
{
scanf("%d%d",&a,&b);
updata(a,b);
}
else if(strcmp(s,"Sub")==0)
{
scanf("%d%d",&a,&b);
updata(a,-b);
}
else if(strcmp(s,"Query")==0)
{
scanf("%d%d",&a,&b);
printf("%d\n",sum(b)-sum(a-1));
}
}
}
return 0;
}
思路:因为数据输入是按照y坐标递增,y坐标相同时,按照x坐标递增输入,用树状数组对x坐标进行统计。
注意:坐标是从0开始的,而树状数组是从1开始的,用树状数组的a的值表示当前在直线x=a-1上的的星星个数。
#include
#include
using namespace std;
const int num=32005;
int n,cnt[num],level[15005];
int lowbit(int x)
{
return x&(-x);
}
void updata(int a,int add)
{
while(a0)
{
ans+=cnt[a];
a-=lowbit(a);
}
return ans;
}
int main()
{
int i,j,x,y,t;
//freopen("in.txt","r",stdin);
scanf("%d",&n);
memset(cnt,0,sizeof(cnt));
memset(level,0,sizeof(level));
for(i=0;i