士兵杀敌二 (树状数组)

使用树状数组解决区间查询和修改问题
本文介绍了一种高效的数据结构——树状数组(BIT),通过使用树状数组实现区间查询和修改操作的优化算法。文章详细阐述了树状数组的基本概念、求和函数、值更新函数的实现,以及如何应用这些函数解决实际问题。
 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了;

转载于:https://www.cnblogs.com/WDKER/p/5409870.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值