BZOJ 4520 : Cqoi2016] 평가 함수 KDtree K까지의 점 + + 스택

암호:

#INCLUDE <비트 / stdc ++. H> 
#DEFINE 줄게 긴 긴 
#DEFINE의 maxn 200000 
#DEFINE의 INF 100000000000000 
#DEFINE의 LSON (t [X] .ch [0]) 
#DEFINE의 rson (t [X] .ch [1]) 
#DEFINE 미드 ((L + R) >> 1) 
네임 스페이스를 사용하여 표준; 
무효 디버그 () 
{ 
    printf와 ( "no_problem \ 없음");   
}     
INT의 N, K, D, 루트; 
setIO (문자열들) 무효화 
{ 
    가 S +. "IN"의 문자열; 
    freopen을 (in.c_str (), "R", 표준 입력);  
} 
priority_queue <LL 벡터 <LL> 큰 <LL>> Q; 
구조체 노드 
{ 
    INT의 P [2], CH [2] minv [2] maxv [2]; 
t} [maxn] T; 
부울 CMP (노드 A, 노드 B) 
{
    ? AP [D] == BP [D] AP를 반환 [D ^ 1] <BP [D ^ 1] : AP [D] <BP [D] 
} 
공극 팔 굽혀 펴기 (INT의 X, Y의 INT) 
{ 
    t [X] .minv [0] = 분 (t [X] .minv [0], t [Y] .minv [0]); 
    t [X] .maxv [0] = 최대 (t [X] .maxv [0], t [Y] .maxv [0]); 
    t는 [X] .minv [1] 분 (t를 [X] .minv [1], t [Y] .minv [1]) =; 
    t [X] .maxv [1] = 최대 (t [X] .maxv [1], t [Y] .maxv [1]);   
} 
INT 빌드 (INT의 L, R의 INT, INT O) 
{ 
    D = O; 
    nth_element (t + 1, t + 미드, t + 1 개 + R, CMP); 
    t [미드] .minv [0] = t의 [미드] .maxv [0] = t의 [미드] .P [0]; 
    t [미드] .minv [1] = t의 [미드] .maxv [1] = t의 [미드] .P [1]; 
    t는 [중반] .ch [0] = t의 [미드] .ch [1] = 0; 
    (MID> l) 경우에 
    { 
        t [미드] [0] = .ch 구축 (L, 중앙 1, o ^ 1); 
        팔 굽혀 펴기 (MID, t [미드] .ch [0]);
    } 
    경우 (R> 중간)
    { 
        t [미드] [1] = .ch 구축 (MID + 1이고, o ^ 1); 
        팔 굽혀 펴기 (MID, t [미드] .ch [1]); 
    } 
    중반를 반환; 
} 
LL 스퀘어 (LL의 X) 
{ 
    창 X * X; 
} 
LL getmax INT (X) 
{ 
    LL ANS = 0; 
    경우 (나는 2 <; I = 0 값 int ++ I) 
    { 
        ANS + = 최대 (평방 (1ll * (t [X] .minv [I] -TP [I])), 스퀘어 (1ll * (t [X를 ] .maxv [I] -TP [I]))); 
    } 
    반환 ANS; 
} 
공극 해결할 INT (X, INT X1, INT Y1) 
{ 
    LL DN = getmax (X) CUR = 스퀘어 (1ll * (t [X] .P [0] - X1)) + 스퀘어 (1ll * (t의 [ X] .P [1] -Y1));      
    DN (<= Q.top ()) 돌아 가면;  
    경우 (현재> Q.top ())            
    {
        Q.pop (); 
        Q.push (CUR); 
    }                        
    게요 DL = LSON? getmax (LSON) -INF; 
    게요 박사 = rson? getmax (rson) -INF; 
    경우 (DL> DR) 
    { 
        경우 (DL> Q.top ()) 해결 (LSON, X1, Y1);   
        경우 (DR> Q.top ()) 해결 (rson, X1, Y1); 
    } 
    다른 
    { 
        경우 (DR> Q.top ()) 해결 (rson, X1, Y1); 
        경우 (DL> Q.top ()) 해결 (LSON, X1, Y1); 
    } 
} 
INT의 main () 
{ 
    // setIO ( "입력"); 
    scanf와 ( "%의 D % d에", N, K); 
    << K = 1;  
    경우 (; 나는 = <N; I ++ = 1 값 int I)는 scanf ( "%의 D % d에", t [i]는 .P [0], t [i]는 .P [1]);  
    난 = K를 <; 위해 (ⅰ = 1 int로;
    경우 (; 나는 = <N; I = 1 값 int I ++) 
    { 
        Tp를 [0] = t의 [I] .P [0]; 
        TP [1] = t의 [I] .P [1]; 
        해결 (루트 Tp를 [0] Tp를 [1]);  
    }    
    의 printf ( "% LLD \ 없음"Q.top ()); 
    0을 반환;    
}

  

추천

출처www.cnblogs.com/guangheli/p/11059499.html