私たちは長い間、ツリーライン理論を研究し、それが再び演奏することを発見し、その結果、コードを理解します
簡単に言えば、セグメントツリーはベースの編集を行うための間隔のパーティションがあり、それは、高い時間効率であります
そして、それはコードである(羅区あまりにもピット、クエリは内部もオープン長い長い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 = 1。CHARC = GETCHAR()。 13 一方、(C> ' 9 ' || C < ' 0 '){ もし、(C == ' - ')W = - 1。C = 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 ビルド(1、1 、N) 69 一方(M-- ) 70 { 71 のint OPT、L、R。 72 LL valを、 73 OPT =を読み取ります()。 74 場合(OPTの== 1)L =(読み取り)、Rは= read()は、scanf関数(" %のLLD "、およびヴァル)、修正(1、1 、N、L、R、ヴァル)。 75 他L =読み取る()、R =リード()のprintf(" %LLDする\ n "、クエリ(1、1 、N、L、R))。 76 } 77 リターン 0 。 78 }
つづく...