POJ - 3714 分治
来源:互联网 发布:php有java难吗 编辑:程序博客网 时间:2024/05/10 01:35
题意:
给出两个集合,每个集合中有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;}
0 0
- poj 3714 Raid 分治
- POJ - 3714 分治
- poj 3714 japan (分治)
- 【分治】【二分】POJ 3714 Raid
- POJ 3714 Raid(分治)
- poj 3714 分治加剪枝
- POJ-1741-treeDP+分治
- POJ 1741 点分治
- 【poj 1741】点分治
- poj 2114 点分治
- POJ 1741 树分治
- POJ-1741 点分治
- POJ 1741 点分治
- POJ 2114 点分治
- POJ 1741 树分治
- POJ - 1987 树分治
- poj 1741 点分治
- poj 1741 点分治
- 下拉列表Select2插件的使用
- maven--maven工程的创建和maven命令的使用
- 2017.2.6 Java有感7
- Python之Series 学习
- 2017.2.6 Java有感7.5(RMI)
- POJ - 3714 分治
- 超分辨率重建——梯度下降、坐标下降、牛顿迭代
- python参数传递方式
- 【CSS】两端对齐
- java多线程
- Leetcode 143. Reorder List
- 安卓之Gallery实现刷新加载和分页加载
- 微信开发环境搭建一
- QT Dom读取XML文档