--- 범위 세그먼트 트리 수정

매우 다양한 부가가치 변경된 값보다도 간격 범위.

범위 값은 부가

아이디어 :

등 [1,8] 구간에서와 같이, 각 노드에 해당하는 지연을 도입 플래그 단순히 노드 5 ([3,4])는 노드 (12)가 ([5]), 표지 된 업데이트 [3,5] 업데이트 업데이트뿐만 아니라, 자신의 부모 업데이트. 때 레이블이있는 영역에 쿼리, 완전히 쿼리 섹션 마크,이 노드의 업데이트 된 값을 포함하고, (게으른 글쎄, 직접 액세스를 업데이트하지 않기 때문에) 한 후 종료하면 바로 지방 분권. 프로세스의 업데이트 간격, 하위 간격에 표시 부모 섹션은하지 않을 때까지, 이미 마크의 표시되어있는 지방 분권이있는 경우는 모든 쿼리 노드 쿼리 간격을 취소하기 때문에 (사실,이 작업이 가능하지, 두 경우 마크는) 쿼리 속도를 속도, 충돌하지 않습니다. 예를 들면, 질의 [1,2,4]. (이 노드의 자식의 역할을 이해할 수있는 태그 업데이트해야합니다)

 

 

코드 : 

CONST의  INT N = 1E5;
int로 A [N], 합계 [N], 지연 [N *의 4 ];
공극 초기화 () { 
    memset 함수 (a, 1 , 를 sizeof (a)); 
    memset 함수 (합계 0 , 는 sizeof (합)); 
    memset 함수 (지연, 0 , sizeof 연산자 ) (지연); 
} 
공극 push_up ( INT의 RT) { 
    합 [RT] = 합계 [RT << 1 ] + 합 [RT << 1 | 1 ]; 
} 
공극 bulid ( INT의 RT, INT의 L, INT의 r)을 {
    경우 (L == R)은 { 
        합 [RT] = A [L]을;
        반환 ; 
    } 
    INT 중간 = (L + R) >> 1 ; 
    bulid (RT << 1 , L, MID); 
    bulid (RT << 1 | 1 중간 + 1 , R); 
    push_up (RT); 
} 
공극 push_down ( INT의 RT, INT의 L, INT의 R) {
     경우 (지연 [RT]) {
         INT m = (L + R) >> 1 ; 
        지연 [RT << 1 ] + = 지연 [RT]; 
        지연 [RT << 1. | 1. ] + = 게으른 [RT] 
        SUM [RT << 1이다. ] + = 게으른 [RT] * (m-L + 1이다. ) 
        [RT SUM << . 1 | . 1 ] + = 게으른 [ RT] * (R- m) 
        게으른 [RT] = 0 ; 
    } 
} 
공극 업데이트 ( INT RT, INT의 L, INT R & LT, INT LL, INT RR, INT V) {
     IF (LL <= L && R & LT <= RR) {// 재귀 경계 : 쿼리 구간을 포함하는 현재 섹션 
        게으른 [RT]을 + = V를 // 태그 (보조 코드의 지연 노드가 갱신을 나타내는 값을 가지며, 자식 노드가 업데이트되지 않음)
        SUM [RT] + = V의 * (L-R 및 LT + 1이다. ); // 현재 노드 업데이트
         복귀 // 인해 지연 그래서이 갱신 될 수있다 
    } 
    push_down (RT, L, R & LT); // 만약 지연 [RT] 거기에, 업데이트 하위 범위는, 자식 노드로 확산되며, 현재 노드는 플래그 태그를 지 웁니다. 이되지 않을 
    값 int m = (L + R 및 LT)에 >> 1. ,
     IF (LL <= m) 업데이트 (RT << 1. , L, m, LL, RR, V),
     IF (RR> m) 업데이트 ( << RT . 1 | . 1 , m + . 1 , R & LT, LL, RR, V) 
    push_up (RT); // 다시 부모 노드를 업데이트 
} 
  질의 ( INT RT, INT의 L, INT의 R & LT, INT의 LL, IFINT의 RR) {
     (LL <= L && R & LT <= RR) 복귀 SUM [RT] 
    push_down (RT, L, R & LT); // 빈 마커 노드 업데이트 여부, 또는 노드를 업데이트 표시는 지연을 확인 
    INT의 m = (L의 + R & LT) >> 1. ,
       RES를 = 0 ;
     IF (LL <= m) = 입술 + 쿼리 (RT << 1. , L, m, LL, RR),
     IF (RR> m) = 입술 + 쿼리 (RT << . (1) | 1. , m + 1. , R & LT는 LL, RR)가
     돌려 , RES를 
}

 너무 늦었, 내일을 작성하는 값을 변경

추천

출처www.cnblogs.com/jjl0229/p/11318561.html