세그먼트 트리 템플릿 플러스 템플릿 제목 POJ3468

POJ - 3468

새 템플릿 트리 라인, 노인 템플릿에, 단지 자신을 유지하기 위해 각 노드의 내용을 저장하거나하지 않습니다 단지 여름 훈련 캠프를 마무리. 리드 푸시 다운을 쓸 때, 나는 쓸 조금 어려울 것 렌. 그래서 새 템플릿을 구성 할 수 있습니다.

각 노드는 또한, L, R, 게으른, 렌을 저장 훨씬 더 명확한 아이디어를 작성합니다.

사용법 #include <iostream> 
#INCLUDE <cstdio>
 #DEFINE LSON (RT << 1)
 #DEFINE rson (RT << 1 | 1)
 #DEFINE의 LSON의 LSON, L, 중간
 #DEFINE의 Rson rson의 중간 + 1, R 
의 typedef  LL;
CONST  INT INF = 0x3f3f3f3f ;
CONST의  INT maxn 1E5 + = 7 ;
사용하는  네임 스페이스 표준을;
구조체 노드 
{ 
    게요 발; // 
    INT 렌; // 长度 
    LL 게으른; // 标记
    INT L, R;// 왼쪽 끝점 
} 트리 [MAXN << 2 ] 

LL ARR [MAXN] 

INT N-, m, 

공극 빌드 ( INT RT, INT의 L, INT R & LT)   // 업적 
{ 
    트리 [RT] .lazy = 0 ; 
    트리 [RT] .L = L, 트리 [RT] .R = & lt; 화학식 
    트리 [RT] .LEN = L - R & LT + 1. ,
     IF (R & LT == L) 트리 [RT] .val ARR = [L]; // 행의 끝에 트리 브로 할당 도달 
    다른 
    { 
        int로 MID = (L + R 및 LT) / 2 ] 
        (LSON)을 빌드; 
        (Rson)을 빌드, 
        트리 [RT] .val= 트리 [LSON] .val + 트리 [rson] .val; 
    } 
} 

공극 푸시 ( INT RT)   // 向下传递지연标记
{
     경우 (트리 [RT]가 .lazy) 
    { 
        트리 [LSON] .lazy + = 트리 [RT] .lazy; 
        트리 [rson] .lazy + = 트리 [RT] .lazy; 
        트리 [LSON] .val + = 트리 [LSON] .LEN * 트리 [RT] .lazy; 
        트리 [rson] .val + = 트리 [rson] .LEN * 트리 [RT] .lazy; 
        트리 [RT] .lazy = 0 ; 
    } 
} 

무효 추가 ( INT의 RT, INT의 ID, LL의 addval를)  // 单点更新
{
     경우 (트리 [RT] 펜닐 == 트리 [RT] .R) 
    { 
        트리 [RT] .val + = addval;
        반환 ; 
    } 
    다른 
    { 
        INT 중간 = (트리 [RT] 펜닐 + 트리 [RT] .R) / 2 ;
        경우 (ID <= (LSON, ID, addval) 추가 중반);
        다른 사람 (rson, ID, addval) 추가; 
        트리 [RT] .val = 트리 [LSON] + .val의 트리 [rson] .val; 
    } 
} 

LL 쿼리 ( INT의 RT, INT의 L, INT R)   // 计算区间和
{
     경우(트리 [RT] 펜닐> = 1 && 트리 [RT] .R <= R)
         복귀 트리 [RT] .val;
    경우 (트리 [RT] 펜닐> R || 트리 [RT] .R < l)
         복귀  0 ; 
    푸시 (RT); 
    리턴 질의 (LSON, L, R) + 쿼리 (rson, L, R); 
} 

무효 업데이트 ( INT의 RT, INT의 L, INT의 R, LL addval)   // 区间更新
{ 
    LL 중반; 
    경우 (트리 [RT] 펜닐> = 1 && 트리 [RT] .R <= R) 
    { 
        트리 [RT] .lazy + = addval; 
        트리 [RT] .val + = 트리 [RT] .LEN * addval;
        반환; 
    } 
    경우 (트리 [RT] 펜닐> R || 트리 [RT] .R < l)
         ; 
    푸시 (RT); 
    업데이트 (LSON, L, R, addval); 
    업데이트 (rson, L, R, addval); 
    트리 [RT] .val = 트리 [LSON] + .val의 트리 [rson] .val; 
} 
INT 의 main () 
{ 
    는 scanf ( " %의 D % d에 " , N, m);
    위한 ( int로 I = 1 ; 나는 <= N; I ++는 ) 
    { 
        는 scanf ( " %의 LLD " , 도착 [I]); 
    } 
    구축 ( 1 , 1,엔);
    위한 ( int로 I = 1 ; I <= m; 내가 ++ ) 
    { 
        문자 들 [ 10 ]; 
        scanf와 ( " %의 S ' , S);
        INT의 L, R; 
        게요 X; 
        경우 (S [ 0 ] == ' C ' ) 
        { 

            는 scanf ( " % D % % LLD D ' , L, R, X); 
            업데이트 ( 1 , L, R, X); 
        } 
        다른 
        { 
            는 scanf ( " % d 개 %의 D ' , L,아르 자형); 
            의 printf ( " % LLD \ 없음 " 쿼리 ( 1 , L, R)); 
        } 
    } 
    반환  0 ; 
}
코드보기

 

추천

출처www.cnblogs.com/Zzqf/p/11628663.html