POJ 2777 트리 라인은 갱신 지연

 

 

주제 링크 : POJ 2777

 

 

질문의 의미 : 플레이트 색상, 색상의 범위 내에서 문의의 수.

 

 

해결 : 색상의 수는 30 개 종에 제목을 포기하기 때문에, 부모 섹션을 업데이트 바이너리 또는 작업에서 빌릴 수 있습니다. 그러나이 세그먼트 트리를 붙여 게으른 ------ 지연 업데이트에 기록됩니다.

 

 

기타가 아주 좋은, 직접 차입이, 작성한 블로그 링크를 https://blog.csdn.net/Tong_zhi/article/details/82683219

 

함축 된 의미는 간격이 발생하는 경우, 업데이트 간격에 포함되어 있다는 것입니다, 기존의 생각에 따르면, 하나 하나를 수정, 잎 노드를 통과 계속하는 것입니다, 그러나 이것은 시간 낭비이다.

(요소가 특정 값으로 변경 될 필요의 범위 내) 등의 순 간격 게으른 마크, 대출, 우리는 그에게 태그를 추가해야합니다. 물었을 때 다음 업데이트하거나 다시는 수정 된 때.

 

그의 아들에 할당 된 자신의 태그에 대해 첫째, 다음, 그의 아들의 마크에 대해 들어, 같은 그들의 표를 취소 : 작업을 수정 하는 경우 다음 업데이트를하거나 변경하기 전에 부탁드립니다.

 

 

푸시 다운 (게으른 태그) :

보이드 푸시 ( INT의 RT) 
{ 
    경우 (트리 [RT] .lazy) { 
        트리 [RT << 1 ] = .COL 트리 [RT << 1 | 1 ] = .COL 트리 [RT] .lazy; 
        트리 [RT << 1 ] = .lazy 트리 [RT << 1 | 1 ] = .lazy 트리 [RT] .lazy; 
        트리 [RT] .lazy = 0 ; 
    } 
    반환 ; 
}

 

 

AC 코드 :

사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <ctime이> 
#INCLUDE <CString을> 
#INCLUDE <cstdlib> 
#INCLUDE <cmath> 
#INCLUDE <큐> 
#INCLUDE <적층> 
#INCLUDE <지도>  
#INCLUDE <알고리즘>
 #DEFINE 맥스 (a, b) ((a)> (b)? (a) :( b))
 로 #define 민 (a, b) ((a) <(b)? (a) :( b))
 #DEFINE Mem0 (X)가 memset (X, 0는 sizeof (X))
 #DEFINE MEM1 (X)가 memset (X, -1는 sizeof (X))
 #DEFINE MemX (X)가 memset (X, 0x3F입니다,는 sizeof (X ))
 하여  스페이스 성병;
타입 정의  LL;
CONST  INT INF = 0x3f3f3f ;
CONST  이중 PI ACOS = (- 1.0 ); 

CONST의  INT MAXN 1E5 + = 10 ;
구조체 의 {
     INT의 L, R; 
    게으른 COL LL; 
} 트리 [MAXN << 2 ];
INT의 L, t, O; // 长度,颜色数,询问次数
LL ANS;
보이드 BTREE ( INT의 RT, INT의 L, INT의 R) 
{ 
    트리 [RT] 펜닐 =의 L; 
    트리 [RT] .R = R; 
    트리 [RT] .lazy= 0 ; 
    트리 [RT] .COL = 1 ;
    경우 (L == R)이 {
         리턴 ; 
    } 
    INT 중간 = (L + R) >> 1 ; 
    BTREE (RT << 1 , L, MID); 
    BTREE (RT << 1 | 1 중간 + 1 , R);
    반환 ; 
} 
공극 푸시 ( INT의 RT) 
{ 
    경우 (트리 [RT] .lazy) { 
        트리 [RT << 1 ] = .COL 트리 [RT << 1 | 1 ] = .COL트리 [RT] .lazy; 
        트리 [RT << 1 ] = .lazy 트리 [RT << 1 | 1 ] = .lazy 트리 [RT] .lazy; 
        트리 [RT] .lazy = 0 ; 
    } 
    반환 ; 
} 
공극 업데이트 ( INT의 RT, int로 A, INT의 B, INT의 C)를 
{ 
    경우 (a> 트리 [RT] || .R B < 트리 [RT] 펜닐) {
         리턴 ; 
    } 
    다른  경우 (a <= 트리 [RT] 펜닐 && 트리 [RT] .R <= b) { 
        트리 [RT] .COL = 트리 [RT] .lazy = 1 << (C-1 );
        반환 ; 
    } 
    푸시 (RT); 
    업데이트 (RT << 1 , A, B, C); 
    업데이트 (RT << 1 | 1 , A, B, C); 
    트리 [RT] .COL = 트리 [RT << 1 ] .COL | 트리 [RT << 1 | 1 ] .COL;
    반환 ; 
} 
공극 쿼리 ( INT의 RT는 int로 하는을 INT의 B)을 
{ 
     경우 (a> 트리 [RT] || .R B < 트리 [RT] 펜닐) {
          리턴 ; 
     } 
     다른  경우(a <= 트리 [RT] 펜닐 && 트리 [RT] .R <= b) { 
         ANS | = 트리 [RT] .COL;
         반환 ; 
     } 
     푸시 (RT); 
     쿼리 (RT << 1 , A, B); 
     쿼리 (RT << 1 | 1 , A, B);
     반환 ; 
} 
찾을거야 (LL가) 
{ 
    INT의 TMP = 0 ;
    동안 (a) {
         경우 (a % 2 == 1 ) 
            TMP ++ ; >> = 1 ; 
    } 
    반환TMP; 
} 
INT 의 main () 
{ 
    는 scanf ( " % D % D % D ' , L, t, O); 
    BTREE ( 1 , 1 , l);
    반면 (o-- ) {
         STR;
        int로 A, B, C를; 
        CIN >> STR;
        경우 (STR == ' C ' ) { 
            는 scanf ( " % D % D % D ' , A, 및 B, 및 C); 
            업데이트 ( 1 , A, B, C); 
        } 
        다른 { 
            scanf와 (" % d 개 %의 D ' , A, 및 B); 
            ANS = 0 ;
            경우 (a> b) 
                질의 ( 1 , B, A);
            다른     
                쿼리 ( 1 , A, B); 
            COUT은 << (ANS) << 찾을 ENDL; 
        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/q1204675546/p/11221097.html