フェンウィックツリー浅い学習

学習ソース

これは、最初の各これらの場所の接頭辞+ kの中にあなたの場所を見つけることは非常に巧妙なlowbitが付属してフェンウィック木の性質は、プレフィックスとしていることに変更されてクリアする必要があります

そして、まだlowbitでこの位置を照会すると、ツリーのアレイに属している必要があります。

 

最も単純には、更新およびクエリ間隔、または間隔更新の一点です

【MAXN] C INT; //フェンウィックツリー
INT N;配列ツリーの//サイズ
INT lowbit(INT X)
{ 
	リターン・X(-X-); 
} 

ボイド更新(私はINT、INT K)
{ 
	一方(I > 0)
	{ 
		C [I]は+ = K; 
		I - = lowbit(I); 
	} 
} 

int型GetSum(I INT)//接頭辞と考え
{ 
	int型ANS = 0; 
	ながら(I <= N){ 
		ANS + = C [I]、
		I + = lowbit(I); 
	} 
	戻りANS; 
}

  

そして、それは、クエリと更新間隔のシングルポイントです

これは、差分のアイデアを使用することが必要である  差分学習を

あなたは違いを学ぶた後、それは非常に単純な、つまり、フェンウィックツリーが格納された差分配列を感じなければなりません、

だから今更新間隔は2回の更新になり、2つの点を更新します。

 

そして、間隔は間隔のクエリで更新

少し複雑範囲クエリは、数式バーの真上に見えます。

2つの値を維持し、一方はSUM1は[](I-1)*和[I]であります

int型SUM1 [MAXN]、SUM2 [MAXN]。
INT、N; //树状数组的大小
INT lowbit(INT X)
{ 
	戻りX&(-x)。
} 

ボイド更新(INT I、int型K)
{ 
	int型、X = I。
	一方、(I> 0)
	{ 
		SUM1 [I] + = K。
		SUM2 [I] + =(X - 1)* K。
		I - = lowbit(I)。
	} 
} 

int型getsum(INT I)//前缀和思想
{ 
	int型のx = iは、
	int型ANS = 0; 
	{(iは= Nを<)しながら
		ANS + = X * SUM1を[I] - SUM2 [I]。
		I + = lowbit(I)。
	} 
	戻りANS。
}

  

 

おすすめ

転載: www.cnblogs.com/EchoZQN/p/11329798.html