セグメントツリーの研究ノート(プライマリー:のみプラス範囲、期間合計)

私たちは長い間、ツリーライン理論を研究し、それが再び演奏することを発見し、その結果、コードを理解します

簡単に言えば、セグメントツリーはベースの編集を行うための間隔のパーティションがあり、それは、高い時間効率であります

そして、それはコードである(羅区あまりにもピット、クエリは内部もオープン長い長いANS)

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <iostreamの>
 4の#include <アルゴリズム>
 5  使って 名前空間STD。
6のtypedef 長い LL。
7  のconst  int型 N = 1E5 + 5 8 LL ADDV [N * 4 ]、[N * sumv 4 ]、[N]を。
9  int型N、M。
10インラインint型リード()
 11  {
 12      INT X = 0、W = 1CHARC = GETCHAR()。
13      一方、(C> ' 9 ' || C < ' 0 '){ もし、(C == ' - ')W = - 1C = GETCHAR();}
 14      ながら(C <= ' 9 ' && C> = ' 0 '){X =(X << 1)+(X << 3)+ C- ' 0 'C = GETCHAR()。}
 15      リターン * W 、X
  K)
 18  {
 19      sumv [K] = sumv [K << 1 ] + sumv [K << 1 | 1 ]。
20  }
 21インラインボイドビルド(INT、O INTの L、INT R)//建树
 22  {
 23に     あれば(L == R){sumv [O]は[L]を=。返す;}
 24      INT半ば=(L + R)>> 1 ; //分治操作
 25      ビルド(O << 1 、L、MID)。
26      ビルド(O << 1 | 1、ミッド+ 1 、R);
27     突き上げ(O);
 28  }
 29  空隙プッシュダウン(INT O、INT L、INT R&LT)//形而上(ツリーからの操作に由来する)プッシュダウン
 30  {
 31は     IF(ADDV [O] == 0のリターン;
 32      ADDV [O << 1 ] + = ADDV [O]、
 33である      ADDV [O << 1。 | 1 ] + = ADDV [O];
 34である     INT MID =(L + R&LT)>> 1 ;
 35      sumv [O << 1 ] + = ADDV [O] *(L + -mid 1。);
 36      sumv [O << 1。| 1 ] + = ADDV [O] *(R- MID);
 37      ADDV [O] = 0 ;
 38である }
 39  ボイド puttag(int型 O、int型の L、int型のR&LT、VのLL)// lazytag操作、怠惰なマーカー
 40  {
 41は      ADDV [O] + = V;
 42である      [O] + =(R&LT-Lの+ sumv 。1)* V;
 43れる }
 44れる 空隙変更(INT O、INT L、INT R&LT、INT QL、INT QR、LL V) //セクション修正
 45  {
 46は     IF(QL <= L && QR> = R&LT){puttag(O、L、R&LT、V); 返す;}
 47      INT ANS = 0、MID =(L + R&LT)>> 1。;
 48      プッシュダウン(O、L、R&LT) ; //プッシュダウンを忘れない
 49      IF(QL <= MID)を変更(O << 1 、L、MID、QL、QR、V)
 50      IF(QR> MID)を変更(O << 1 | 1、+ MID 1 、R&LT、QL、QR、V)
 51が     押し上げ(O);    
 52である }
 53は、 LLクエリ(INT O、INT L、INT R&LT、INT QL、INT QR)//問合せ部
 54  {
55      であれば(QL <= L && QR> = R)戻りsumv [O]。
56      プッシュダウン(O、L、R)。
57      LL ANS = 0 58      INT半ば=(L + R)>> 1 59      であれば(QL <= MID)ANS + =クエリ(O << 1 、L、中間、QL、QR)。
60      であれば(QR> MID)ANS + =クエリ(O << 1 | 1、中間+ 1 、R、QL、QR)。
61の     リターンANS。
62  }
 63  のint main()の
 64  {
 65      N =(読み取り)M = 読み取ります();    
66      のためにint型 i = 1 ; iが= N <; ++ I)
 67          のscanf(" %のLLD "、および[I])。
68      ビルド(11 、N)
69      一方(M-- 70      {
 71          のint OPT、L、R。
72          LL valを、
73          OPT =を読み取ります()。
74          場合(OPTの== 1)L =(読み取り)、Rは= read()は、scanf関数(" %のLLD "、およびヴァル)、修正(11 、N、L、R、ヴァル)。
75          L =読み取る()、R =リード()のprintf(" %LLDする\ n "、クエリ(11 、N、L、R))。
76      }
 77      リターン 0 78 }

つづく...

おすすめ

転載: www.cnblogs.com/cptbtptpbcptbtptp/p/11605615.html