羅区P3374 [テンプレート]フェンウィックツリー1(プラス単一点、および範囲)

トピックリンク

https://www.luogu.org/problemnew/show/P3374

フェンウィックツリー

フェンウィックツリーは、最も基本的な要件や範囲です。

メンテナンス:

  • 宇宙複雑:O(n)は、
  • 時間の複雑さ(及び間隔、修正のシングルポイント):

    変更:O(LOGN)

    クエリ:O(LOGN)

C [i]を用いて(I-lowbit [I] + 1、i)および範囲を表します。

クエリ、および接頭辞を使用するアイデア、(I、J)= Cの[J] -c [I-1]。

利点

コードはシンプルです

短所

理解しにくいです

コード(解決)

1つの#include <iostreamの>
 2の#include <cstdioを>
 3。 使用した 名前空間STD;
 4  のconst  int型 = MAXN 500 005 ;
 5  int型N-、M;
 6  INT C [MAXN];
 7  INT lowbit(INT X){ // 対応する番号を見つけます。後方、前方から第1の2値1。
8      リターン - (X)X&; // - (6)例えば:. 6(110)> lowbit = 2; 12である(1100で) - > lowbit =(12)で4。
9。 }
 10  空隙更新(int型 X、int型 V){ // 初期化し、更新する
11の     ためにのInt I = X; I <= N + = lowbit Iは、(I))は{ // 自分の手のビデオをクリックし
12である          C [I] = + V;
 13である     }
 14  }
 15  INTクエリ(INT X){     // クエリ:等、そのような相互更新
16      INT RES = 0 ;
 17      用のint型、I> I = Xを0 ; lowbit = I-(I))= RES + Cする[I];
 18で     復帰RES;
 19  }
 20  INT メイン()
 21は 、{
 22は      CIN >> N- M、
 23である     ためint型 I = 1 iが++; iが<= N ){
 24          INT V。
25          のscanf(" %dの"、&V)。
26          更新(I、V)。
27      }
 28      のためのint型 I = 1 ; I <= M; iは++ ){
 29          のint 、K、X、Y。
30          のscanf(" %D%D%D "、&​​K、およびX&Y)。
31          もし(K == 1 )アップデート(X、Y)
32          もし(K == 2)COUT <<クエリ(Y)-query(X- 1)<<endl;
33      }
 34      リターン 0 35 }

 

おすすめ

転載: www.cnblogs.com/yinyuqin/p/10961243.html