
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 int a[1000010],c[1000010]; 6 int N,M; 7 8 int lowbit(int x) 9 { 10 return x&(-x); 11 } 12 13 int sum(int i) //BIT的求和 , 计算前i项的和,需要从i开始,不断把当前位置i的值加到结果中,并把i中减去i的二进制最低位非0为对应的幂,直到i变成0为止。 14 { 15 int s=0; 16 while(i>0) 17 { 18 s+=c[i]; 19 i-=lowbit(i); //x&-x即 x&(x-1) 求最低位为1的数。 20 } 21 return s; 22 } 23 24 void change (int x,int m) //BIT的值更新,使第i(x)项的值增加x需要从i(x)开始,不断把当前位置i的值增加x,并把i的二进制最低位非0为对应的幂加到i上 25 { 26 int i; 27 for(i=x;i<=N;i+=lowbit(i)) 28 c[i]+=m; 29 } 30 31 int main() 32 { 33 char s[20]; 34 memset(s,0,sizeof(s)); 35 scanf("%d%d",&N,&M); 36 for(int i=1;i<=N;i++) 37 { 38 scanf("%d",a+i); 39 change(i,a[i]); 40 } 41 int m,n; 42 while(M--) 43 { 44 scanf("%s%d%d",s,&m,&n); 45 if(s[0]=='Q') 46 printf("%d ",sum(n)-sum(m-1)); 47 else 48 change(m,n); 49 } 50 return 0; 51 } 52
刚开始用写了一个子函数,即当加入时,把i的后面全加上x,不用想了,肯定超时。
最后上网上找了下题解,看到用树状数组。so 直奔挑战程序看了关于相关知识,了解到把 BIT(树状数组)的求和子函数和BIT的值更新子函数写好。就ok了;