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)
名前空間stdを使用。
空デバッグ()
{ 
    のprintf( "no_problemの\ nを");   
}     
int型N、K、D、ルート。
setIO(文字列s)無効
{ 
    "に" = S内の文字列+します。
    freopenは(in.c_str()、 "R"、STDIN)。  
} 
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、int型のY)
{ 
    T [X] .minv [0] =分(T [X] .minv [0]、T [Y] .minv [0])。
    T [X] .maxv [0] = MAX(T [X] .maxv [0]、T [Y] .maxv [0])。
    T [X] .minv [1] =分(T [X] .minv [1]、T [Y] .minv [1])。
    T [X] .maxv [1] = MAX(T [X] .maxv [1]、T [Y] .maxv [1])。   
} 
INTビルド(int型L、int型のR、INT O)
{ 
    D = O; 
    nth_element(T + 1、T + MID、T + 1つの+ R、CMP)。
    T [中間] .minv [0] = tの[中間] .maxv [0] = tの[中間] .P [0]。
    T [中間] .minv [1] = tの[中間] .maxv [1] = tの[中間] .P [1]。
    T [中間] [0] = tの[中間]は.CH .CH [1] = 0。
    (MID> L)場合
    、{ 
        T [中間] [0]・CH =構築(L、ミッド1、O ^ 1)。
        押し上げ(MID、T [中間] .CH [0])。
    } 
    もし、(R> MID)
    { 
        T [中間] [1]・CH =構築(MID + 1、R、O ^ 1)。
        押し上げ(MID、T [中間] .CH [1])。
    } 
    半ばを返します。
} 
LL SQ(LL x)から
{ 
    X * X返します。
} 
LL getmax(INT X)
{ 
    LL ANS = 0。
    (; iが2 <++ iが0 = INT)のために
    { 
        ANS + = MAX(SQ(1LL *(T [X] .minv [I] -Tp [I]))、SQ(1LL *(T [X ] .maxv [I] -Tp [I])))。
    } 
    戻りANS。
} 
ボイドが解決する(INT X、INT X1、INT Y1)
{ 
    LL DN = getmax(X)、CUR = SQ(1LL *(T [X] .P [0] -X1))+ SQ(1LL *(Tの[ X] .P [1] -Y1))。      
    (DN <= Q.top())戻った場合。  
    もし(CUR> Q.top())            
    {
        Q.pop(); 
        Q.push(CUR)。
    }                        
    LLのDL = LSON?getmax(LSON):-inf。
    LLのDR = rson?getmax(rson):-inf。
    IF(DL> DR)
    { 
        IF(DL> Q.top())を解決(LSON、X1、Y1)。   
        (DR> Q.top())(rson、X1、Y1)を解く場合。
    } 
    { 
        IF(DR> Q.top())(rson、X1、Y1)を解きます。
        IF(DL> Q.top())(LSON、X1、Y1)を解きます。
    } 
} 
int型のmain()
{ 
    // setIO( "入力")。
    scanf関数( "%d個の%のD"、&N、&K)。
    K << = 1。  
    (I 1 = int型、iが<= N; I ++)のためのscanf( "%D%dの"、&T [i]は.P [0]、&T [i]は.P [1])。  
    以下のために(INT i = 1; iが= Kを<; ++ I)Q.push(0)。
    (; iが<= N I ++ I = 1 INT)のために
    { 
        Tpを[0] = tの[I] .P [0]。
        TP [1] = tの[I] .P [1]。
        解決(ルート、Tpの[0]、Tpを[1])。  
    }    
    のprintf( "%LLDする\ n"、Q.top())。
    0を返します。    
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/11059499.html