POJ 3741 Raid (平面最近点对)

$ POJ~3741~Raid $ (平面最近点对)

POJ 3741 Raid (平面最近点对)_第1张图片



$ solution: $

有两种点,现在求最近的平面点对。这是一道分治板子,但是当时还是想了很久,明明知道有最近平面点对,但还是觉得有点不对劲。基本算法专题出最近平面点对?怎么感觉我 $ Noip $ 凉了? 这题不会是个坑吧。。。。

嗯,不瞎扯了。来回顾一下分治求平面点对的过程,首先将点按横坐标排序,然后整个区间不断往下二分,回溯的时候归并排序(这其实我来再写一次题解的原因,以前写的都是快排,但必须承认归并的复杂度才是最稳最准的)。我们将两个区间合并时,从中间点想外扩 $ d $ 的距离,这个距离内的点才有可能更新答案,而且这个距离里的每个点都不会计算多次,这个是有证明的 。然后我们暴力计算即可。



$ code: $

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define ll long long
#define db double
#define rg register int

using namespace std;

int t,n;

struct su{
    db x,y;
    bool z;
    inline bool operator <(const su &yy){
        return x>1;
    db d=min(ask(sl,mid),ask(mid+1,sr));
    rg l=sl,r=mid+1,tt=sl;
    while(l<=mid&&r<=sr)
        if(a[l].yd)continue;
        while(r<=sr&&b[r].y-b[l].y<=d)++r;
        for(rg j=i+1;j

你可能感兴趣的:(POJ 3741 Raid (平面最近点对))