세그먼트 트리 연구 노트 (주 : 만 플러스 범위, 간격 합)

우리는 오랜 시간 동안 트리 라인 이론을 공부하고 다시 연주 것을 발견 결과적으로 코드를 이해

간단히 말해, 세그먼트 트리를 기반으로 편집을 할 수있는 간격의 파티션, 그것은 높은 시간 효율성이다

그런 다음이 코드는 (루오 구 너무 구덩이, 질의 내부도 ans와 개방 오래 오래)

1 #INCLUDE <cstdio>
 2 #INCLUDE <CString을>
 3 #INCLUDE <iostream>
 4 #INCLUDE <알고리즘>
 5  이용  스페이스 성병;
6 타입 정의  LL;
7  CONST의  INT N = 1E5 + 5 ;
(8) LL의 ADDV는 [N * 4 ] sumv [N * 4 ], A [N];
9  INT의 N, m;
10 인라인 INT의 판독 ()
 11  {
 12      INT (X) = 0 = w, 1 ; C = 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]는 [1]을 =; 반환 }
 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 + - 중간 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] + = sumv (R & LT-L +를 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 <= 1 && QR> = R) 복귀 sumv [0];
56      푸시 (O, L, R);
(57)      LL의 ANS = 0 ;
58      INT 중간 = (L +의 연구) >> 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 ; 나는 <= N; ++ I)
 (67)          는 scanf ( " %의 LLD " , & A [I]);
68      빌드 ( 1 , 1 , N);
(69)      동안 (M-- )
 70      {
 71          INT의 선택 해제, L, R;
72          LL의 발;
(73)          선택 해제는 = ) (판독;
74          경우 (최적화 된 == 1 ) L = (판독), R은 = () 읽기는 scanf ( " %의 LLD " , 발), 수정 ( 1 , 1 , N, L, R, 발);
75          다른판독 L = (), R = (읽기)의 printf ( " % LLD \ 없음 " 쿼리 ( 1 , 1 , N, L, R));
76      }
 77      반환  0 ;
78 }

계속하려면 ...

추천

출처www.cnblogs.com/cptbtptpbcptbtptp/p/11605615.html