poj3714レイド(分割統治は、平面上の最も近い点を見つけます。)

トピックリンクします。https://vjudge.net/problem/POJ-3714

質問の意味:最短距離のために、2つの設定ポイントを考えます。

アイデア:1 * AF場合は、-1に設定の2 fは、その後、2点間の距離を見つけ、1の集合体であるfをもとに平面上の最も近い点は、私はFが付い訪問していないどのような条件を加え、距離BFを計算= -1、または製品は、INF 1が返された場合。そして、同じ他のhdoj1007に。

ACコード:

#include <cstdioを> 
する#include <アルゴリズム> 
の#include <cmath> 
の#include <cstdlib>
 使用して 名前空間STD。

const  int型 MAXN = 2E5 + 5 constの ダブル INF = 1e30。
INT T、N、CNT、ID [MAXN]。
構造体ノード{
     int型X、Y、F。
} PT [MAXN]。

ブール 演算子 <(CONSTノードと、CONSTノード&B){
     場合(AX == BX)戻り AY < によって、
    リターン斧< BX。
}

BOOL CMP(INT A、INT B){
     戻り PT [A] .Y < PT [B] .Y。
} 

二重 DIST(CONSTノードと、CONSTノード&B){
     場合(AF *のBFの== 1戻りINF。
    リターン SQRT(1.0 *(AX-BX)*(AX-BX)+ 1.0 *(AY-による)*(ay- )によります)。
} 

二重 fenzhi(int型 L、INT R){
     ダブル D = INF。
    もし(L == R)戻りD。
    もし(L + 1 == R)戻りDIST(PT [L]、PT [R])。
    INT半ば=(L + R)>> 1 
    D =分(fenzhi(L、MID)、fenzhi(MID + 1 、R)); 
    CNT = 0 ;
    INT T1、T2、L1 = L、R1 = 中間、MID1。
    一方(L1 <= R1){ 
        MID1 =(L1 + R1)>> 1 もし(PT [中間] .X-PT [MID1] .X <D)R t = mid1- 1 他の L1 = MID1 + 1 ; 
    } 
    T1 = L1。
    L1 =ミッド+ 1、R1 =R;
    一方(L1 <= R1){ 
        MID1 =(L1 + R1)>> 1 もし(PT [MID1] .X-PT [中間] .X <D)L1 = MID1 + 1  R1 = mid1- 1 
    } 
    T2 = R1。
    以下のためにint型 I = T1と、私は= T2を<; ++ i)の
            ID [ ++ CNT] = I。
    ソート(ID + 1、ID + CNT + 1 、CMP)。
    以下のためにint型 i = 1 ; iは、CNTを<; ++ I)
         のためにint型 J = +1 ; J <= CNT &&(PT [ID [j]] Y-PT [ID [I]] Y <D。); ++ j)は
            、D = 分(D、DIST(PT [ID [I]、 PT [ID [J]));
    リターンD; 
} 

int型のmain(){ 
    scanf関数(" %のD "、&T)。
    一方、(T-- ){ 
        scanf関数(" %のD "、&N)
        以下のためにint型 i = 1 ; iが= < 2 * N; ++ i)が{ 
            scanf関数(" %D%D "、およびPT [I] .X、&PT [I] .Y)。
            場合 PT [i]は式(I = Nを<)。;
            他の PT [i]が.F = - 1 ; 
        } 
        ソート(PT + 1、PT + 1 + 2 *のN)。
        printf(" %.3fする\ n "、fenzhi(12 *のN))。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11411688.html