国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

POJ - 3714 分治

2019-11-11 06:32:11
字體:
來源:轉載
供稿:網友

題意:

給出兩個集合,每個集合中有n個點,求屬于不同集合的兩個點之間的最短距離。

思路:

分治,套用最接近點對問題的方法,只要在保存res的時候判斷是否是屬于同一個集合即可。

代碼:

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;typedef long long ll;const int MAXN = 2e5 + 10;const ll INF = 0x3f3f3f3f3f3f3f3f;struct Point {    double x, y;    int flag;}p[MAXN], q[MAXN];bool cmpx(const Point &a, const Point &b) {    return a.x < b.x;}bool cmpy(const Point &a, const Point &b) {    return a.y < b.y;}double dist(Point a, Point b) {    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}double solve(int l, int r) {    if (l == r) return INF;    if (l + 1 == r) {        if (p[l].flag != p[r].flag) return dist(p[l], p[r]);        return INF;    }    int m = (l + r) >> 1;    double res = min(solve(l, m), solve(m + 1, r));    int cnt = 0;    for (int i = l; i <= r; i++)        if (fabs(p[i].x - p[m].y) <= res) q[++cnt] = p[i];    sort (q + 1, q + cnt + 1, cmpy);    for (int i = 1; i <= cnt; i++) {        for (int j = i + 1; j <= cnt; j++) {            if (q[j].y - q[i].y >= res) break;            if (q[i].flag != q[j].flag)                res = min(res, dist(q[i], q[j]));        }    }    return res;}int main() {    int T;    scanf("%d", &T);    while (T--) {        int n;        scanf("%d", &n);        for (int i = 1; i <= n; i++) {            scanf("%lf%lf", &p[i].x, &p[i].y);            p[i].flag = 0;        }        for (int i = n + 1; i <= 2 * n; i++) {            scanf("%lf%lf", &p[i].x, &p[i].y);            p[i].flag = 1;        }        sort (p + 1, p + 1 + 2 * n, cmpx);        PRintf("%.3f/n", solve(1, 2 * n));    }    return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祁连县| 尉犁县| 金堂县| 桦南县| 任丘市| 孝感市| 韶山市| 阳城县| 阿拉善左旗| 托里县| 清水河县| 布尔津县| 嘉禾县| 班戈县| 柳江县| 潼南县| 堆龙德庆县| 谷城县| 岳阳县| 宝应县| 开封县| 东至县| 隆德县| 苍梧县| 黄大仙区| 衡水市| 韶山市| 邵东县| 呈贡县| 辽中县| 武川县| 和静县| 金阳县| 酒泉市| 布拖县| 建平县| 柘荣县| 灵丘县| 永安市| 宁国市| 呼和浩特市|