前不久学习了树状数组,今天才打算做做相关题目,于是选择了杭电oj的1166,各个营地士兵的数量的问题
不说什么了,直接上代码吧
#include<stdio.h>
#include<string.h>
using namespace std;
int N;//有N个营地
int c[50005];
int y; //临时存储输入的数组的值;
int lowbit(int x)
{
return x&(-x);
}
int Sum(int c[],int x) //直接求的前x项和
{
int sum=0;
while(x>0)
{
sum+=c[x];
x=x-lowbit(x);
}
return sum;
}
void change(int c[],int i,int x)//更新每一个C[n];
{
while(i<=N)
{
c[i]+=x;
i=i+lowbit(i);
}
}
int main()
{
int i,T;
scanf("%d",&T);
int t=T;
while(T--)
{
memset(c,0,sizeof(c));
char ml[20]={0};
int m,n;
printf("Case %d:\n",t-T);//输出第几个测试案例
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d",&y);//输入数据同时更新c[i];
change(c,i,y);
}
while(scanf("%s",ml)!=EOF)//每一个命令
{
if(strcmp(ml,"Add")==0)
{
scanf("%d%d",&m,&n);
change(c,m,n);
}
if(strcmp(ml,"Sub")==0)
{
scanf("%d%d",&m,&n);
change(c,m,-n);
}
if(strcmp(ml,"Query")==0)
{
scanf("%d%d",&m,&n);
printf("%d\n",Sum(c,n)-Sum(c,m-1));//前n个数的和减去前m-1个数的和 即num(m~n)=n-m+1;
}
if(strcmp(ml,"End")==0)
{
break;
}
}
}
return 0;
}
PS:1、需要注意每个测试案例要初始化。2、输入数据的时候不要丢掉个数scanf(“%d%d”,&m,&n); 一定要个数对应(这两个问题我就是这么错的,浪费了不少时间55555~)