세그먼트 트리 (B) : 간격 수정

    한 지점에서 트리 라인을 설명하고 쿼리 간격은, 사실, 트리 라인도 더 많은 일을 할 수 있습니다 수정합니다. 이 섹션은 섹션을 개정하는 문제에 대해 설명합니다.

    달러 (A $)의 N $의 - 요소 배열 $ A_1을 감안할 때, A_2, ..., A_n $, 당신의 작업은 다음과 같은 두 가지 작업을 지원하는 데이터 구조를 설계하는 것입니다 :

  • $ 추가 (L, R, V) $ 다음 $ A_L, A_ {L} + 1, ..., 전체 증가 값 A_R $ $ V $
  • $ 쿼리 (L, R) $ : $ 계산 서브 시퀀스의 A_L, A_ {L} + 1, ..., A_R $ 요소 및 최대 값과 최소값

    포인트는 수정 $ logn의 $ 노드에 영향을 미치지 만, 전체 범위의 작업을 $ $를 추가 실행하면 최악의 경우 간격 수정은 모든 노드에게, 예를 들어, 트리에 $ 합계 $를 모든 노드에 영향을 미칠 것 그것은 변경됩니다. 그것을 어떻게?

    모든 간격 이하 $ 2 시간 $ 분리 된 간격으로 나눌 수 있습니다 이전 범위 쿼리는 결론을 기억하자. 이 결론, 우리는 "분할"수로, $ 가동 이하 $ 2 개 시간 $ 작업을 분해 추가 $를 넣어 세그먼트는 노드 트리를 기록했다.

    여전히 $ $으로 합으로 표시되는 경우 유지 보수 정보는 [0] "$의 O $으로 노드 간격 모두의 개수에 대응하는"요구의 변화 후 $ $ $ 조작 최악 $의 SUM 모든 수정 추가 (변질, 부패가없는 여부 $ $를 추가). 용액 $의 합 [0] $의 정의는 "추가 $ $을 $ O $으로 동작 노드와 하위 노드, 노드 $의 O $으로 간격은 모든 수의 합에 해당하는 경우에만 실행한다." 이러한 추가 정보는 여전히 쉽게 유지 관리 할 수 ​​있으며, 영향을받는 추가 $ $ 당 노드의 원래의 수는 $ O (H) $가 될 수 있습니다.

    다음과 같이 유지 보수 코드는 다음과 같습니다

. 1  공극은 (유지 INT의 O, INT의 L, INT R & LT)
 2  {
 . 3      IF MINV이 [O]는 [L]을 = (R & LT == L)를; // 노드가 리프 인 경우 
. 4      다른   MINV [O] = 분 (MINV을 [ 2 * O] MINV [ 2 * + O 1이다. ]);     // 경우 비 리프 노드 
5.      MINV [O] + = ADDV [O];      // 고려 추가 조작 
. 6  }
 7.  
8.  INT CL, CR, V;   // 간격 수정 [CL, CR] + = V] 
. 9  공극 업데이트 ( INT의 O, INT의 L,INT R)   //
 10  {
 11      INT M = L의 + (RL) / 2 ;
12      의 경우 (CL <= L && R <= CR) ADDV [0] + = V;
13      다른 
14      {
 15 일          경우 (CL <= M) 업데이트 ( 2 *의 O, L, M);
16          의 경우 (CR> M) 업데이트 ( 2 * O + 1 , M + 1 , R);
17      }
 18      (O, L, R)을 유지;
19 }

    이 시간 MINV 재귀 경계 노드에서 다음 사항을 참고하면 추가 작업이다, MINV 자식 노드 (즉, 하위 섹션) 추가 작업이 영향을 고려하지 않기 때문에 정확하지 않습니다.

    전반적으로 동일한 쿼리하기 전에,하지만이 조상 노드의 영향을 고려해야합니다. 따라서, 우리는 (추가 마크 자체 유지에서 고려 되었기 때문에, 그 자체를 포함하지 않음)는 다음과 같이 매개 변수 $ 원하는 상위 노드 $의 추가 $ 값의 전류 범위를 나타내는 $ 재귀 쿼리를 추가 :

하나  의 INT QL, QR;     // 区间查询, 분 {QL, QR} 
2  의 INT 쿼리 ( INT의 O, INT의 L, INT의 R, INT의 추가)
 3-  {
 4-      INT M = L의 + (R - 1) / 2 ;
도 5      의 경우 (QL <= L && R <= QR)   복귀 minv [0] + 추가;
(6)      다른 
7      {
 8          INT ANS = INF;
9          + = 추가 ADDV [0]을;
10          의 경우 ANS = 분 (ANS, 질의 ((QL <= M) 2 *O, L, M은))을 추가;
11          의 경우 (QR> M) ANS = 분 (ANS 쿼리 ( 2 * O + 1 , M +는 1 , R는) 추가);
12          리턴 ANS;
13      }
 14 }

    동작 점의 업적은 생략 동일한 수정한다.

 

추천

출처www.cnblogs.com/lfri/p/11105222.html