樹狀數組(Binary Indexed Tree) 查詢,更新(加值)模板

 這是看劉汝佳的那本白書寫的代碼,關於樹狀數組一些簡單的操作查詢區間和和更新值某點值。

查詢只是返回從1到第i個元素的和,還不是任意的區間(l,r)。不過用r的結果減去l-1的結果就可以求得任意(l,r)的區間和。

更新也只是將第i個元素加某一值,減法做法也類似。

下面是代碼:

#include<cstdio>
#include<cstdlib>
#include<cstring>
int n;
int c[100];
//c數組為待處理的數組a中的一段連續和
//ci為在左邊最靠近原數組中第i個元素的祖先的後一個到第i個自身所有元素之和
int lowbit(int x)
{
	return x&(-x);		//計算第x位的lowbit,
}
int sum(int k)   			//calculate the sum of first k element
{
	int s=0;
	while(k>0)
		{
			s+=c[k];
			k-=lowbit(k);
			//不斷向左邊去找最近的祖先,直到找到root或左邊無祖先,k為c數組的下標
		}
		return s;
}
void update_add(int add_num,int k)  //add add_num to the k's element
{
	while(k<=n)
		{
			c[k]+=add_num;
			k+=lowbit(k);
			//不斷向右邊去找最近的祖先,直到找到root或右邊無祖先,k為c數組之下標
			//不斷將c數組中包含第k元素的節點加值
		}
}
int main()
{
	freopen("in.txt","r",stdin);
	int a[100];
	int i,j,m;
	while(scanf("%d",&n)==1 && n!=0)
	{
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);//讀入原數組a
		memset(c,0,sizeof(c));
		for(i=1;i<=n;i++)
			{
				j=i-lowbit(i)+1;
				for(int u=j;u<=i;u++)
					c[i]+=a[u];
				//建構c數組
			}
		for(i=1;i<=n;i++)
			printf("%d\n",c[i]);
//============================================================================
//以下為測試樹狀數組add(x,d)和query(1,r)是否成功,輸入m個指令,每條一行
//若指令為a開頭,後面跟兩個數字d和x,則為將原數組a的第x個元素加d
//若為s開頭,後面跟一個數字k,則為查詢數組a中1到k之和
			scanf("%d",&m);    //input m operations
			char ch=getchar();	
			char cc[4];
			while(m--)
			{
				gets(cc);
				if(cc[0]=='a')	// if the first alphabet is a,the operation is add a number to k's element,such as a35
					{update_add(cc[1]-'0',cc[2]-'0');
					 for(i=1;i<=n;i++)
						printf("%d	",c[i]);
						printf("=====\n");
					}
					else printf("%d\n",sum(cc[1]-'0'));// otherwise query the sum of first k elements,such as s6
			}
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值