突发奇想,用双线程似乎可以优化一些暴力

比如说平面最近点对这个题目,把点复制成2份

一份按照x排序,一份按照y排序

然后双线程暴力处理,一份处理x,一份处理y

如果数据利用x递减来卡,那么由于双线程,它卡不住y

如果数据利用y递减来卡,那么卡不住x

这样暴力n^2就可以过了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct P
{
int id;
double x, y;
bool operator <(const P& B)const { return x < B.x; }
}p[], p2[];
bool cmp(const P &A, const P &B)
{ return A.y < B.y; }
double dis(P &A, P &B) { return (A.x-B.x)*(A.x-B.x) + (A.y-B.y)*(A.y-B.y); }
int main()
{
int n;
while(cin>>n)
{
if(n == ) break;
double d = 1e8;
for(int i = ; i <= n; i++) scanf("%lf %lf", &p[i].x, &p[i].y), p2[i].x = p[i].x, p2[i].y = p[i].y;
sort(p2+, p2++n, cmp);
sort(p+, p++n);
int tot1 = , tot2 = ;
for(int i1 = , i2 = , li1 = , li2 = ; i1 <= n && i2 <= n; )
{
for(int j = li1; j >= ; j--)
{
d = min(d, dis(p[i1], p[j]));
if(((p[i1].x - p[j].x)*(p[i1].x - p[j].x) >= d)|| j == ) { i1++; li1 = i1-; break;}
if(tot1 >= tot2) { tot1 += ; li1 = j-; break; }
tot1++;
}
for(int j = li2; j >= ; j--)
{
d = min(d, dis(p2[i2], p2[j]));
if(((p2[i2].y - p2[j].y)*(p2[i2].y - p2[j].y) >= d) || j == ) { i2++; li2 = i2-; break; }
if(tot2 >= tot1) { tot2 += ; li2 = j-; break; }
tot2++;
}
}
printf("%.2f\n", sqrt(d)/);
}
}

hdu1007 平面最近点对(暴力+双线程优化)的更多相关文章

  1. 『Raid 平面最近点对』

    平面最近点对 平面最近点对算是一个经典的问题了,虽然谈不上是什么专门的算法,但是拿出问题模型好好分析一个是有必要的. 给定\(n\)个二元组\((x,y)\),代表同一平面内的\(n\)个点的坐标,求 ...

  2. 「LuoguP1429」 平面最近点对(加强版)

    题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...

  3. POJ 3741 Raid (平面最近点对)

    $ POJ~3741~Raid $ (平面最近点对) $ solution: $ 有两种点,现在求最近的平面点对.这是一道分治板子,但是当时还是想了很久,明明知道有最近平面点对,但还是觉得有点不对劲. ...

  4. P1429 平面最近点对(加强版)(分治)

    P1429 平面最近点对(加强版) 主要思路: 分治,将点按横坐标为第1关键字升序排列,纵坐标为第2关键字升序排列,进入左半边和右半边进行分治. 设d为左右半边的最小点对值.然后以mid这个点为中心, ...

  5. P1429 平面最近点对[加强版] 随机化

    LINK:平面最近点对 加强版 有一种分治的做法 因为按照x排序分治再按y排序 可以证明每次一个只会和周边的六个点进行更新. 好像不算很难 这里给出一种随机化的做法. 前置知识是旋转坐标系 即以某个点 ...

  6. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

  7. HDU-4631 Sad Love Story 平面最近点对

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 数据是随机的,没有极端数据,所以可以分段考虑,最小值是一个单调不增的函数,然后每次分治算平面最近 ...

  8. [Swust OJ 1084]--Mzx0821月赛系列之情书(双线程dp)

    题目链接:http://acm.swust.edu.cn/problem/1084/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  9. HDU1007--Quoit Design(平面最近点对)

    Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...

随机推荐

  1. 洛谷题解:P1209 【[USACO1.3]修理牛棚 Barn Repair】

    原题传送门:https://www.luogu.org/problemnew/show/P1209 首先,这是一道贪心题.  我们先来分析它的贪心策略.  例如,样例:  4 50 18  3 4 6 ...

  2. motto - Express 4.x Request对象获得参数方法

    本文搜索关键字:motto express node js nodejs javascript request body request.body 1. req.param() 该方法获得参数最为方便 ...

  3. tcp文件下载客户端+服务端

    客户端: import socket if __name__ == '__main__': # 创建tcp客户端socket tcp_client_socket = socket.socket(soc ...

  4. CentOS 6.5通过yum安装 MySQL-5.5

    1.安装mysql-5.5的yum源 rpm -ivh http://repo.mysql.com/yum/mysql-5.5-community/el/6/x86_64/mysql-communit ...

  5. 怎么退出jQuery的each函数

    返回 'false' 将停止循环 (就像在普通的循环中使用 'break').返回 'true' 跳至下一个循环(就像在普通的循环中使用'continue'). 以下举例如何退出 each 函数和退出 ...

  6. 【HTML】placeholder中换行

    表示回车 表示换行 案例 <textarea rows="10" placeholder="测试换行 新的一行"></textarea>

  7. 千锋教育Vue组件--vue基础的方法

    课程地址: https://ke.qq.com/course/251029#term_id=100295989 <!DOCTYPE html> <html> <head& ...

  8. Altium Designer使用5:AD18的DXP在什么地方?

    1.在顶上的菜单栏右击

  9. Aizu:0005-GCD and LCM

    GCD and LCM Time limit 1000 ms Memory limit 131072 kB Problem Description Write a program which comp ...

  10. The Road to learn React书籍学习笔记(第一章)

    react灵活的生态圈 Small Application Boilerplate: create-react-app Utility: JavaScript ES6 and beyond Styli ...