나무의 다중 학교 4 K 번째 가장 가까운 거리 의장 절반 대답

  문제의 의미와 m 질의 서열을 감안할 Q의 간격 거리 (LR)와 P (의 절대 값의 차이)를 작게 K lrpk 인공 지능

 

게임의 절반 간격의 위치에서 LR P를 찾을 때되는 좌우 한 후 미친 초과 K 트래버스   

 

복잡성은 K를 제거 할 

 

직접 절반 응답  

의 수와 간격 [P-중반, P + 중간]에서 LR 회장 나무의 유지 보수

참고이 고전 회장 나무 유지 관리 모드가! ! ! ! ! ! 유지 구간은 [인공 지능 Y, X에 속하는]의 개수

 

 

일반 트리 회장은 첨자로 분리 간격 T에 발생합니다

 

이는 T의 우선 큰 순서 작은 데이터에 기초 

 

 

 

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병; 

CONST의  INT의 N = 110000 ;
CONST의  INT의 M = 2000000 ; 

int로 노드를;
INT B [N], ID [N];
INT의 어린 아이, K; 

INT T [M] LSON의 [M의, rson [M] → [M]; 



인라인 무효화 업 ( INT (X), INT의 L, INT의 R, INT 사전, INTPOS) 
{ 
    POS = ++ ncnt; 
    LSON [POS] = LSON [중고]; 
    rson [POS] =rson [중고]; 
    t [POS] = t의 [중고] + 1 ;
    경우 (L == R)  ; INT의 m = L +의 연구 >> 1 ;
    경우 (X <= m)를 (X, L, m, LSON [POS] LSON [POS]);
    다른 업 (X, m + 1 , R, rson [POS] rson [POS]); 
} 

공극 qsum ( INT의 L, INT의 R, INT (X), INT의 Y, INT의 L, INT의 R) 
{ 
    경우 (TOT> = K) ; 
    
    경우 (L <= 1 && R <= R) 
    { 
        TOT + t = [Y] -t [X];반환 ; 
    } 
    INT의 m = L +의 연구 >> 1 ;
    경우 (L <= m) qsum (L, R, LSON [X]의 LSON [y를, L, m);
    경우 (R> m) qsum (L, R, rson [X] rson [Y] m + 1 , R); 
} 
 


INT 의 main () {
     INT의 ncase; CIN >> ncase;
    반면 (ncase-- ) {
         INT의 PRV = 0 ;
        INT의 N, m; scanf와 ( " %의 D % d에 " , N, m);
        위한 ( int로 I = 1 ; i가 N = <; 내가 ++)는 scanf를 ( " %의 D ", 및 B [I]), ID [I] = I; 
        정렬 (ID + 1 , ID + N + 1 , [( int로 I, INT의 J) { 리턴 B가 [I] < 2 [J]}); 
        정렬 (B + 1 , B + N + 1 ); 
        
        ncnt = 0 ; 
        
        위한 ( int로 I = 1 에서 (ID [I] 난 ++; 나는 <= N)의   1 N, T [I- 1 ], T [I]);   // 루트 [I] = 수정 (1, 1, N, ID [I], 루트 [I - 1]); 
        
        위한 ( int로 I = 1 I <= m; 나는 ++) {
             INT의 L, R, P; 
            scanf와 ( " % D % D % D % D ' , L, R, P, K); 
            L ^ = PRV, R ^ = PRV, P ^ = PRV, K는 ^ = PRV; 
            
            int로 - 성 = 1 , = EN , 1E8을
            반면 (EN - 성> 1 ) {
                 INT 미드 세인트 + = EN >> 1 ;
                INT의 L = LOWER_BOUND (B + 1 , B + N + 1 , P - MID) - B;
                INT R = UPPER_BOUND (B + 1 , B + N + 1 , P + MID) - B -1 ; 
                TOT = 0 ; 
            
                qsum (L, R, T [1 - 1 ], T [R] 1 , N);
                경우 (TOT> = K) EN = 미드;
                다른 일 = 중간; 
            } 
            PRV = EN; 
            의 printf ( " % D \ 없음 " , EN); 
        } 
    } 
    반환  0 ; 
}
코드보기

 

추천

출처www.cnblogs.com/bxd123/p/11279626.html