시장의 포스터 POJ - 2528 트리 라인 간격 범위

// 세그먼트 트리 간격 커버리지 
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <iostream> 
#INCLUDE <알고리즘>
 은 USING  스페이스 STD 단계;
 CONST  INT N = 100010 ;
 INT 플래그;
 구조체 노드 {
     INT의 L, R & LT;
     // VIS 이 영역은 완전히 덮은 
    BOOL ; VIS 
} TR [N << 2 ]
 구조체 포인트 
{ 
    INT의 ID를,
     INT X; 
} POST [N << 2 ]
 INT CMP1 (점 A, 점 B)
{
    AX < BX; 
} 
INT의 CMP2 (점 A, 점 B) 
{ 
    경우 (a.id == b.id)
          AX < BX;
    반환 a.id> b.id을; 
} 
공극 팔 굽혀 펴기 ( INT U) 
{ 
    TR [U] .vis = TR [U << 1 ] .vis && TR [U << 1 | 1 ] .vis; 
} 
공극 빌드 ( INT U, INT (L), INT (R)) 
{ 
    TR [U] = {L, R, 0 };
    경우 (L == R)
        반환;
    INT 중간 = L + R >> 1 ; 
    빌드 (U << 1 , L, MID); 
    빌드 (U << 1 | 1 중간 + 1 , R); 
} 
공극 쿼리 ( INT U, INT (L), INT (R)) 
{ 
    경우 (TR [U] .vis)
         ;
    경우 (TR [U] 펜닐 == L && TR [U] == .R R) 
    { 
        TR [U] .vis = 1 ; 
        플래그 = 1 ;
        반환 ; 
    }
    INT 중간 TR = [U] 펜닐 + TR [U] .R >> 1 ;
    경우 (R <= MID) 
        쿼리 (U << 1 , L, R);
    다른  경우 (L> MID) 
        쿼리 (U << 1 | 1 , L, R);
    
    { 
        쿼리 (U << 1 , L, MID); 
        쿼리 (U << 1 | 1 중간 + 1 , R); 
    } 
    (U)를 팔 굽혀 펴기; 
} 
INT 의 main () 
{ 
    INT의 t, N; 
    CIN >> t;
    동안(T-- ) 
    { 
        CIN >> N-;
         // 이산 데이터 전에 
         ( INT I = 0 ; I < 2 * N-] + I = 2 ) 
        { 
            CIN >> POST [I] .x를 POST >> [I + . (1) ] .x와; 
            POST [I] .ID = POST [I + 1이다. ] .ID = I; 
        } 
        // 이산화 전에 정렬 데이터 
        정렬 (POST, POST + 2 * N-, CMP1)를; 
         // 이산화 
        INT TOT = 0 , 미리 = 0 ;
          ( 지능 I = 0 ; I < 2 * N-; I ++ ) 
        { 
            // 이전과는 경우 
             // 다음으로 순위 
            IF (POST [I] .x를 == 사전) 
            { 
                POST [I] .x를 = TOT ; 
            } 
            // 현재 값을 기록하지 않으면
             // ++ 순위 
            다른을 
            { 
                미리 = POST [I] .x와; 
                POST [I]를 .x를 = ++ TOT; 
            } 
        } 
        빌드 ( . 1 , . 1 , 2 *N-) 
         //는 정렬 뒤에서 붙여
         // ID 큰 앞에 
        정렬 (POST, POST + 2 * N -, CMP2)
         INT ANS = 0 ;
          ( INT I = 0 ; I < 2 * N-; I +을 = 2 ) 
        { 
            INT의 L = POST [I] .x와;
             INT R & LT POST = I + 1이다. ] .x와; 
            에서 플래그 = 0 , 
            쿼리 ( 1. , L, R & LT)
             IF (인 플래그) 
                ANS ++ ; 
        }    
        COUT<< ANS << ENDL; 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/QingyuYYYYY/p/12293741.html