HDU 다중 대학 교육 대회 4 HDU 6621 K 번째 가장 가까운 거리

08 질문 끊기 전기 멀티 학교 4 차전.

이진 트리 + 회장

주제는 나무의 대통령으로해야 참조하십시오. 그 당시 만 먼저 생각하는 구간에서 발견하고 오랫동안 쓸 폭력을 찾기 위해 최대 169 K, P 순위보고, 코드가 지불 조정할 조금 어려운 RE 다른 ​​그름 해당 단계의 결과로, WA해야한다 , 이는 다시했다.

, 해석 회장 트리 플러스 두 점, 두 지점 중간에 대답하고, 번호가 K보다 큰 경우 다음 대통령 트리 쿼리 간격 LR는 점에서 [P-중반, P + 중간]의 범위 번호, 우리의 중반을 설명하기 위해 큰 선택, 다음은 중간, 또는 증가 중반을 줄일 것, 두 지점이 될 수 있습니다.

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
#DEFINE INF 0x3f3f3f3f의
 CONST의  INT N = + 1E6 (10) ;
CONST  INT 개조 1E9 + = 7 ;
CONST의  INT의 M = + 1E6 (10) ;
// CONST INT의 MX = 1E6; 
구조체 나무 {
     INT의 탄소 나노 튜브, LC, RC; 
} T [(M << 6 )];
INT의 루트 [N], A [N], 2 [N];
값 int m, Q, TOT, N;
무효 빌드 ( INT & RT, INT의 L, INT의 R) //建立一颗空树
{ 
    RT = ++ 어린 아이; 
    T [RT] .CNT = 0 ; 
    T [RT] .lc = T [RT] .RC = 0 ;
    경우 (L == R) ;
    int로 중간 = (L + R) >> 1 ; 
    빌드 (T [RT] .lc, L, MID); 
    빌드 (T [RT] .RC 중간 + 1 , R); 
} 
공극 인서트 ( INT의 L, INT R, INT 및 CUR, INT의 전, INT의 POS) 
{ 
    T [ ++ TOT] = [중고] T; 
    CUR =더하다; 
    T [CUR] .CNT ++ ;
    경우 (L == R) ;
    int로 중간 = (L + R) >> 1 ;
    경우 (POS <= 삽입 MID) (좌, 중, T [CUR] .lc, T .lc, POS [중고]);
    다른 삽입 (MID + 1 , R, T [CUR] .RC, T [중고] .RC, POS); 
} 
INT의 쿼리 ( INT의 L, INT의 R, INT의 X, INT의 Y, INT의 K) 
{ 
    경우 (R <= k)에 반환 T를 [Y] .CNT - T [X] .CNT;
    경우 (L == R) {
         T [Y] .CNT - T [X] .CNT; 
    } 
    INT S = T [T [Y] .lc] .CNT - T [T [X] .lc] .CNT;
    int로 중간 = (L + R) >> 1 ;
    경우 (K <= MID) {
         리턴 질의 (좌, 중, T [X] .lc, T [Y] .lc, K); 
    } 
    다른 {
          (S) + 쿼리 (MID + 1 , R, T [X] .RC, T [Y] .RC, K); 
    } 
} 
INT의 최대 ( int로 하는 INT의 b)는 
{ 
    복귀 A> B를? A : B; 
} 
INT 의 main () 
{ 
    INT의 T; 
    scanf와 (" %의 D ' , T);
     ( INT의 t = 1 , t <= T; t ++ ) 
    { 
        INT MX = 0 ; 
        scanf와 ( " %의 D % d에 " , N, m);
        위한 ( int로 I = 1 ; 나는 <= N; ++ i가 ) 
            (scanf와를 " %의 D ' , A [I]), MX = 최대 (MX A [I]); 
        TOT = 0 ; 
        빌드 (루트 [ 0 , 1 , MX);
        대한 (int로 I = 1 ; 난 = <N; 난 ++ ) 
            (삽입  , MX 루트 [I] 루트 [I - 1 ], A [I]);
        INT의 LST = 0 ;
        반면 (M-- ) 
        { 
            INT의 L, R, P, K; 
            scanf와 ( " % D % D % D % D ' , L, R, P, K); 
            L ^ = LST, R ^ = LST, K ^ = LST, P ^ = LST;
            INT의 L = 0 , R = 1E6;
            반면 (L < R) 
            { 
                INT 중간 = (L + R) >>1 ;
                INT CNT = 쿼리 ( 1 , MX 루트 [1 - (1) ], 루트 (R), P + MID);
                경우 (p - 중간 - 1 > 0 ) CNT - 질의 = ( 1 , MX 루트 [1 - (1) ], 루트 (R), P - 중간 - 1 );
                경우 (CNT> = K) R = 미드;
                다른 L = 중간 + 1 ; 
            } 
            의 printf ( " % D \ 없음 " , LST = L); 
        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/xiaoguapi/p/11278478.html