コード:
#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を返します。 }