樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)

CTGU - 缺變形戰士發表於2020-12-27

題目連結

題目描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

這是LibreOJ上的樹狀陣列模板題,這個題考查的點是單點修改和區間查詢。在此附上一版我的AC程式碼:

#include<iostream>
using namespace std;
typedef long long ll;//這個題必須用int會爆。

ll n, q;
ll a[1000000+10];//a是原陣列
ll c[1000000+10];//b是維護a的樹狀陣列。

ll lowbit(ll x)
{
	return x & -x;
}

void creat(){
	for(ll i=1;i<=n;i++){
		c[i]+=a[i];
		ll j=i+lowbit(i);
		if(j<=n) c[j]+=c[i];
	}
}
//建樹函式。
void add(ll x, ll k){
	while(x<=n){
		c[x]+=k;
		x+=lowbit(x);
	}
}
//單點修改函式。
ll getsum(ll x){
	ll sum=0;
	while(x>=1){
		sum+=c[x];
		x-=lowbit(x);
	}
	return sum;
}
//求前x項和函式.
int main()
{
	scanf("%lld%lld", &n,&q);
	for(ll i=1;i<=n;i++){
		scanf("%lld", &a[i]);
	}
	creat();
	ll flag, a, b;
	for(ll i=1;i<=q;i++){
		scanf("%lld%lld%lld", &flag, &a, &b);
		if(flag==1) {
			add(a,b);
		} else if(flag==2){
			ll sumda, sumxiao;
			sumda = getsum(b);
			sumxiao = getsum(a-1);
			sumda-=sumxiao;//區間和可以看做是倆個字首和的差。
			printf("%lld\n", sumda);
		}
	}
	return 0;
 } 

相關文章