hdu1007 平面最近点对(暴力+双线程优化)
突发奇想,用双线程似乎可以优化一些暴力
比如说平面最近点对这个题目,把点复制成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 平面最近点对(暴力+双线程优化)的更多相关文章
- 『Raid 平面最近点对』
平面最近点对 平面最近点对算是一个经典的问题了,虽然谈不上是什么专门的算法,但是拿出问题模型好好分析一个是有必要的. 给定\(n\)个二元组\((x,y)\),代表同一平面内的\(n\)个点的坐标,求 ...
- 「LuoguP1429」 平面最近点对(加强版)
题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...
- POJ 3741 Raid (平面最近点对)
$ POJ~3741~Raid $ (平面最近点对) $ solution: $ 有两种点,现在求最近的平面点对.这是一道分治板子,但是当时还是想了很久,明明知道有最近平面点对,但还是觉得有点不对劲. ...
- P1429 平面最近点对(加强版)(分治)
P1429 平面最近点对(加强版) 主要思路: 分治,将点按横坐标为第1关键字升序排列,纵坐标为第2关键字升序排列,进入左半边和右半边进行分治. 设d为左右半边的最小点对值.然后以mid这个点为中心, ...
- P1429 平面最近点对[加强版] 随机化
LINK:平面最近点对 加强版 有一种分治的做法 因为按照x排序分治再按y排序 可以证明每次一个只会和周边的六个点进行更新. 好像不算很难 这里给出一种随机化的做法. 前置知识是旋转坐标系 即以某个点 ...
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
- HDU-4631 Sad Love Story 平面最近点对
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 数据是随机的,没有极端数据,所以可以分段考虑,最小值是一个单调不增的函数,然后每次分治算平面最近 ...
- [Swust OJ 1084]--Mzx0821月赛系列之情书(双线程dp)
题目链接:http://acm.swust.edu.cn/problem/1084/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- HDU1007--Quoit Design(平面最近点对)
Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...
随机推荐
- Linux赋予普通用户root权限
本文以新建用户admin来举例,请自行替换自己需要的用户 方法一: vi编辑 /etc/sudoers 文件,找到 root ALL=(ALL) ALL,在下面添加一行,如下所示: ## ...
- RHEL7.X安装12.2RAC时root.sh错误CLSRSC-400的解决方案
问题现象: [root@ora12c ghome]# /opt/oracle/ghome/root.sh Performing root user operation. The following e ...
- 使用JavaScript动态的绑定、解绑 a 标签的onclick事件,防止重复点击
页面上的 a 标签如下: <a class="more" style="cursor: pointer;" id="commentMore&qu ...
- HJ浇花
题目描述 HJ养了很多花(99999999999999999999999999999999999盆),并且喜欢把它们排成一排,编号0~999999999999999999999999999999999 ...
- PXE自动化安装CentOS6/7
服务器为centos7 安装前准备:关闭防火墙和SELINUX 虚拟机准备第二块网卡,设置主机模式,关闭虚拟机网络配置中主机模式的DHCP功能,并设置静态IP nmcli c a con-name e ...
- JS中常犯错误
01.==与=== 释: 在JavaScript中使用三等号来判断两个条件是否相等.使用等于关系运算符时,只有两边的条件相等时,结果才为真,否则就是假.注意等于关系运算符并不只是判断 数字类型的数据, ...
- js中document的用法小结
document常用属性: document.title//设置文档标题,与HTNL中的title标签等价 document.bgColor//设置页面背景颜色 document.fgColor//设 ...
- ubuntu built-in display 产生的一个原因
在没有禁用开源的显卡驱动 nouveau 下,从 apt 安装了nvidia的驱动,导致了后面开机后,系统不能正确的识别到显示器,整个界面分辨率变的非常小,在设置菜单中的显示设置中也不能调节分辨率,并 ...
- python__基础 : 类的 __slots__ 方法
实例在创建出来之后,可以动态的添加属性和方法, 那如果想要限制添加的实例属性,可以用一下 __slots__ 这个东西: class Test(object): __slots__ = ('name' ...
- Makefile (3) 基本语法和使用
make是用来管理一个工程项目的工具 . Makefile就是这个项目文件 . 1.Makefile 是由若干条规则组成的,每个规则的语法如下所示 : #规则 targets: prerequisit ...