这数据还是拦不住贪心

P1429 平面最近点对(加强版)

saxiy @ 2019-09-22 15:23:25

被最后一个点hack数据气到了随手乱码了一个比较函数就过了。。。

我重新思考人类的本质

#pragma GCC optimize("fast-math,unroll-loops")
#include <bits/stdc++.h>
#define N 200005
using namespace std;

struct point {
    double x, y;
    void in() { scanf("%lf%lf", &x, &y); }
} p[N];

struct OPX {
    bool operator() (const point &a, const point &b) const {
        return a.x == b.x ? a.y < b.y : a.x < b.x;
    }
};

struct OPY {
    bool operator() (const point &a, const point &b) const {
        return a.y == b.y ? a.x < b.x : a.y < b.y;
    }
};

struct OPXX { //随手乱码的比较函数
    bool operator() (const point &a, const point &b) const {
        return a.x - b.x < a.y - b.y;
    }
};

int n; double ans = DBL_MAX;

inline double p2(double x) { return x * x; }

inline double mhdis(const point &a, const point &b) {
    return p2(a.x - b.x) + p2(a.y - b.y);
}

void solve() {
    for(int i = 1;i < n;i++)
        ans = min(ans, mhdis(p[i], p[i - 1]));
}

int main() {
    scanf("%d", &n);
    for(int i = 0;i < n;i++) p[i].in();
    sort(p, p + n, OPX());
    solve();
    sort(p, p + n, OPY());
    solve();
    sort(p, p + n, OPXX());
    solve();
    printf("%.4f", sqrt(ans));
    return 0;
}

我觉得这题要拦无脑贪心是不可能的(就跟淬火一样),次优解要多少有多少。。最后就是调排序函数的事情。。 (大不了random_shuffle)


by _兰_ @ 2019-09-22 15:33:53

嗯…构造数据的时候如果随机撒圆心,然后确定半径在圆周上随机撒点,应该会强一些吧?

还有关于您的第三个cmp,如果不加绝对值符号的话,卡掉应该很简单吧?(0,4),(4,0),(-7,-7),(10,10)就卡掉了吧……


by _兰_ @ 2019-09-22 15:38:30

6
4 0
0 4
-7 -7
10 10
-100 2
2 100

然后这个贪心其实还是很好卡的,刚才忘记还有两个cmp了

然后还有,就是随机排列的话命中概率低得很⑧


by SSerxhs @ 2019-09-22 15:40:15

有必要吗...

像第一篇题解那样随机转角就好了


by saxiy @ 2019-09-22 15:43:06

但是这种贪心简单无脑啊,转角还有三角函数呢。


by saxiy @ 2019-09-22 15:46:47

主要是跑得快。。。


by 142857cs @ 2019-09-22 15:48:29

。。。


by 142857cs @ 2019-09-22 15:48:44

有必要吗。。。


by saxiy @ 2019-09-22 15:49:04

开个玩笑,肯定不可能用random_shuffle的,大概就是找近距离点的关系规律排个序吧。。要是能骗到90pts+也不错啊。。


|