POJ - 2528 명 시장의 포스터 (트리 라인, 분리 공정)

질문의 의미 : 주어진 넓은 범위의 것은 (1 <= 리 <= 10000000)이 범위에 나타납니다 주어진 수정을 요청 m를 의미하며, 마지막 포스터의 전체 수를 보여달라고

아이디어는 우리가 분리 된 데이터를 생각하는 것 같은 넓은 범위를 볼 수, 키가 큰 이산 실제로 압축 된 데이터 공간이 주어 말했다. 데이터가 빈 공간에 너무 넣어 압력 (1 1E7에) 전체 주어지지 않기 때문에, 다른 연속 공간 예약

사용하지 않을 때는 연속 공간 압축 빈 공간으로 공간을 증가시키기 위해, 그 주

 

전체 코드 :

#INCLUDE <CString을> 
#INCLUDE <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <알고리즘>
 은 USING  공간 STD;
 CONST의  INT MAXN = 1E5;
 CONST  INT INF = 0x3f3f3f3f ;
 INT SEG는 [MAXN는 << 2 ]
 int로 게으른 [MAXN를 < < 2 ]
 INT ARR [MAXN, ANS [MAXN]
 INT 최근,
 INT의 L [MAXN, R & LT [MAXN] 약 // 저장 심문 범위
 의 INT TOT,
 int로 압축 후 // 세그먼트; DSEG [MAXN]를 트리 

무효 push_up ( INT의 P) {
    경우 (SEG [P << 1 ] == SEG [P << 1 | 1 ]) 
        SEG [P] = SEG [P << 1 ];
    다른 SEG [P] = INF; 
} 
공극 push_down ( INT의 P, INT의 L, INT의 R) {
     경우 (지연 [P]! = INF) { 
        지연 [P << 1 ] = 지연 [P]; 
        지연 [P << 1 | 1 = 지연 [P]; 
        SEG [P << 1 ] = 지연 [P]; 
        SEG [P << 1| 1 = 지연 [P]; 
        지연 [P] = INF; 
    } 
} 
공극 빌드 ( INT의 P, INT의 L, INT의 r)을 {
     경우 (L == R) { 
        SEG [P] =의 도착 [1];
        반환 ; 
    } 
    INT 중간 = (L + R) >> 1 ; 
    빌드 (p << 1 , L, MID); 
    구축 (P << 1 | 1 , 중반 + 1 , R); 
    push_up (p); 
} 
무효 업데이트 ( INTP, INT의 L, INT R, INT QL, INT QR, INT V) {
     경우 (QL <= 1 && R <= QR) { 
        SEG [P] = V; 
        지연 [P]는 = V 단계;
        반환 ; 
    } 
    push_down (P, L, R); 
    int로 중간 = (L + R) >> 1 ;
    경우 (QL <= MID) 업데이트 (p << 1 , L, 중간, QL, QR, V);
    경우 (QR> MID) 업데이트 (p << 1 | 1 중간 + 1 , R, QL, QR, V); 
    push_up (p); 
} 
무효 쿼리 (INT의 P, INT의 L, INT R, INT QL, INT QR) {
     경우 (SEG [P]! = INF) {
         경우 (SEG [P]가 = 마지막) SEG [P]를 ++ ans와! ; 
        마지막 =의 SEG [P];
        반환 ; 
    } 
    경우 (L == R) = {INF 마지막; 반환 }
     INT 중간 = (L + R) >> 1 ; 
    push_down (P, L, R); 
    쿼리 (p << 1 , L, 중간, QL, QR); 
    쿼리 (p << 1 | 1 중간 + 1 , R, QL, QR); 
}
INT 의 main () {
     INT T, N-; 
    CIN >> T,
     그동안 (T-- ) { 
        TOT = 0 ; 
        CIN >> N-;
         IF (! N-) COUT << 0 << ENDL;
         // 마다 때문에 이 간격 커버리지 문제 때문에 여기 업데이트 데이터에 해당 기록 
        다른 {
              ( INT K = 0 ; K <N- K ++ ) { 
                CIN >> L [K] >> R & LT [K]는, 
                DSEG [TOT ++] = L [K] 
                DSEG [TOT ++] = R & LT [K]; 
            }
            // 개별 처리 
            정렬 (DSEG, DSEG + TOT)
             INT LEN = UNIQUE (DSEG, DSEG + TOT) - DSEG;
             INT의 크기 = LEN,
              ( INT I = 1. , I는 크기 <; I는 ++ ) {
                 // 간격하지 않는 관하여 연속 부 블랭크 (이전보다 큰 공간을 복용 1.) 증가 
                IF (DSEG [I] - DSEG [I- 1. ]> 1이다. ) DSEG [LEN ++ = DSEG [I- 1. ] + 1이다. ] 
            } 
            정렬 (DSEG, DSEG + 렌)
             에 대해 ( int로 I = 0; I <N-; I는 ++ ) {) {
                 // 다음 이산 좋은 L로 재진입, R 배열 
                L의 [I]가 = LOWER_BOUND (DSEG, DSEG + LEN, L [I]) - + DSEG 1이다. ] 
                R & LT [I] DSEG = LOWER_BOUND (DSEG, + LEN, R & LT [I]) - DSEG + 1이다. ] 
            } 
            가 memset (게으른, INF, sizeof의 (게으른)); 
            memset 함수 (ARR, INF, sizeof의 (ARR)); 
            memset 함수 (ANS, 0 , sizeof의 (ANS)); 

            빌드 ( 1. , 1. , 렌을)
             위해 ( int로 나 나 = 0 ; 나는 <N-, 나는 ++ 
                업데이트 ( 1. , 1. 렌, L [I], R & LT [I] + I 1이다. ) 
            } 
            마지막 = INF] 
             // 포스터의 수 (도 말할 통계적 컬러) 카운트 
            (쿼리 . 1 , . 1 , LEN, . 1 , LEN)
             int로 CNT = 0 ;
              ( INT I = 1이다. ]은 I = LEN <; I는 ++ ) {
                 IF (ANS [I]) CNT ++ ; 
            } 
            COUT << CNT << ENDL; 
        } 
    } 
}

 

추천

출처www.cnblogs.com/Tianwell/p/11297520.html