poj2528 세그먼트 트리 + 이산 (포스터)

이 질문에 대한 첫 번째 이산 지식,하지만 기존의 이산 이산를 사용합니다.

유닛 (1)은 단위 길이 때문에 개별 다음 예로서 (대상 시료)이 될 것 아래의

      1. 4. 3. 6 7 8 2 10

     - - - - - - - -

      1 2 5 4 3 6 7 8

이산 X [1] = 1, X [2] = 2; X [3] = 3; X [4] = 4, X [5] = 6, X [7] = 8, X [8] = (10)

다음, 다음 순서대로 각 포스터 1 내지 8 (트리 라인) 벽의 폭은, 서로 다른 색의 세그먼트 수의 최종 집계를 업데이트하기 위해 더 작은 세그먼트로 맵핑 큰 범위.

하지만 이러한 단순한 이산화이 잘못

같은 세 포스터 :. 1 ~ 10 1 ~ 10 ~. 제 6

X- [. 1] = 이산화. 1, X [2] = 4, X [3] = 6, X [4]를 10 =
첫 번째 장을 계시 : 1-4 벽 1 염색되며
제 장 계시 : 1 내지 2 벽은 여전히 1, 3, 4 염색;
셋째 장 계시 : 3-4 벽은 2 여전히 3,1 염색.
마지막으로, 첫 번째 포스터는 출력이 있지만, 사실은 그렇게 중요하지 않습니다 그래서 완전히 덮여 표시, 그것은 올바른 출력 3입니다.

새로운 개별 방법 : 객실 다수의 추가는, 1 이상 차이가 예를 들어 14610위한 중간체 5 이상 첨가 (6,10 및 1,4 사이 알고리즘 실제로 숫자 사이에 첨가된다)

X [1] = 1, X [2] = 4, X [3] = 5, X [3] = 6, X [5] = (10)

(1) 염색 제 1~5 후 이와 같이 상기 제 1-2 차 2를 염색하고, 상기 제 4-5 3 염색

마지막으로, 1 ~ 2 5 ~ 1, 4, 2, 3, 3, 3 때문에 정확한 출력 결과있다.

붙여 넣기 포스터, 트리 라인 열린 공간을 생각 뒤쪽에 관심을 지불한다. C ++와 POJ이 살 수 G ++를 통과하지 수, 이유를 알고하지 않습니다

오류 참고도 이산 매우 경향의 이산 범위라는 것을 소개.

사용법 #include <iostream> 
#INCLUDE < 문자열 > 
#INCLUDE <cstdlib> 
#INCLUDE <알고리즘> 
#INCLUDE <cmath> 
#INCLUDE <CString을> 
#INCLUDE <cstdio> 
#INCLUDE <벡터> 
#INCLUDE <큐> 
#INCLUDE <지도> 
#INCLUDE < 세트 > 
#INCLUDE <비트 세트> 
#INCLUDE <iomanip> // 의 #pragma 주석 (링커 "/ STACK : 1024000000,1024000000")
 // #DEFINE의 파이 ACOS (-1)
 // #INCLUDE <비트 / stdc ++ .H>사용하는 네임 스페이스


  표준을;
형식 정의를 LL;
#DEFINE INF 0x7f7f7f7f // 2139062143 
#DEFINE INF1 0x3f3f3f3f // 1061109567 
#DEFINE INF2 2147483647
 #DEFINE llINF 9223372036854775807
 #DEFINE PI 3.141592653589793 // 23,846,264,338,327,950,254 
#DEFINE PB와 push_back
 #DEFINE LL 긴 긴
 #DEFINE 디버그 COUT << "디버그 \ n ';
// freopen을 ( "R", 표준 입력 "입니다.");
// freopen을 ( "w", 표준 출력 "알아.");
// IOS :: sync_with_stdio (거짓) cin.tie (NULL); 
#DEFINE SCAI (X)는 scanf ( "%의 D",
 sca2i (X, Y)는 scanf ( "% D % D ', X, Y)
 #DEFINE SCAF (X)는 scanf ("%의 LF ", X)
 #DEFINE sca2f (X, Y)는 scanf ("% LF % LF ", X, Y)
 #DEFINE 용 (m, n)에 대한 (INT I = m; I <N; I ++) #DEFINE 로컬 
#ifdef와 로컬 #endif 다음의 #DEFINE MAX 10233
 #DEFINE의 LCH (I) ((I) << 1)
 #DEFINE RCH (I) ((I) << 1 | 1) INT X [MAX] [ 2 ];
INT LSH [MAX << 1 ]; 구조체 노드 
{ INT의 L, R;
    int로 게으른; 
} 트리 [MAX << 3 ];









    

빌드 (INT의 RT, INT (L), INT (R)) 
{ 
    // 디버그 
    트리 [RT] 펜닐 = L; 
    트리 [RT] .R = R; 
    트리 [RT] .lazy = 0 ;
    경우 (L == R) 
    { 
        ; 
    } 
    INT 중간 = (L +의 연구) >> 1 ; 
    빌드 (RT << 1 , L, MID); 
    빌드 (RT << 1 | 1 , 중반 + 1 , R); 

} 

BOOL updata ( INT RT, INT L, INT R) 
{ 
    경우 (트리 [RT] .lazy) 
    { 
        반환  거짓 ; 
    } 
    다른  경우 (트리 [RT] 펜닐 == L && 트리 [RT] == .R R) 
    { 
        트리 [RT] .lazy = 1 ;
        반환  사실 ; 
    } 
    INT의 중간 = (트리 [RT] 펜닐 + 트리 [RT] .R) >> 1 ;
    bool에 플래그를;
    경우 (R <= MID) 
    { 
        플래그 = updata (RT << 1 , L, R); 
    } 
    다른  경우 (L>MID)
    { 
        플래그 = updata (RT << 1 | 1 , L, R); 
    } 
    다른 
    { 
        BOOL 인 flag1 updata = (RT << 1 , L, MID);
        불리언 flag2 updata = (RT << 1 | 1 중간 + 1 , R); 
        플래그 = 인 flag1 || flag2; 
    } 
    경우 (트리 [RT << 1 ] .lazy == 1 && 트리 [RT << 1 | 1 ] .lazy == 1 ) 
        트리 [RT] .lazy = 1 ;
        반환 플래그를;

} 
INT 의 main () 
{ 
    INT 케이스; 
    scanf와 ( " % D \ n " , 및 케이스);
    반면 (Case-- ) 
    { 
        INT의 N; 
        scanf와 ( " %의 D ' , N);
        INT (K) = 0 ;
        위한 ( INT 난 = 0 , N I <; I ++ ) 
        { 
            scanf와는 ( " % D % D ' , X [I] [ 0 ], X [I] [ 1 ]); 
            LSH [K ++] = X [I]0 ]; 
            LSH [K ++] = X [i]는 [ 1 ]; 
        } 
        정렬 (LSH, LSH의 + K);
        INT 크기 = 고유 (LSH, LSH + K) - LSH; 
        K = 크기;
        위한 ( INT 난 = 0 ; I <크기; I ++ ) 
        { 
            경우 (LSH [I] - LSH [I- 1 ]> 1 ) 
                LSH [K ++] = LSH [I] + 1 ; 
        } 
        크기 = K; 
        종류 (LSH, LSH의 +크기); 
        빌드 ( 1 , 0 , 크기 - 1 ); 

        INT ANS = 0 ;
         ( INT I = N- 1 ] I> = 0 ; 난 ... ) 
        { 
            INT의 L = LOWER_BOUND (LSH, LSH + 사이즈, X [I] [ 0 ]) - LSH;
            INT R = LOWER_BOUND (LSH, LSH + 사이즈, X [I] [ 1 ]) - LSH; 
            경우 (updata ( 1 , L, R)) 
                ans와 ++ ; 
        } 
        의 printf ( " 가 % d \ n" , 년); 
    } 
}

 

추천

출처www.cnblogs.com/hulian425/p/12233501.html