士兵杀敌二 (树状数组)

 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\n",sum(n)-sum(m-1));
47         else
48             change(m,n);
49     }
50     return 0;
51 }
52     
View Code

刚开始用写了一个子函数,即当加入时,把i的后面全加上x,不用想了,肯定超时。

最后上网上找了下题解,看到用树状数组。so 直奔挑战程序看了关于相关知识,了解到把 BIT(树状数组)的求和子函数和BIT的值更新子函数写好。就ok了;

posted on 2016-04-19 20:04  青春的梦想付诸行动  阅读(99)  评论(0编辑  收藏  举报

导航