传送门:

pid=2966" target="_blank">点击打开链接

题意:给n个点,求对于每一个点到近期点的欧几里德距离的平方。

思路:看鸟神博客学kd树劲啊点击打开链接

kd树事实上是暴力树。,真的。

它把一个平面划分成了非常多个小平面。每次划分的根据是平面中按x排序的点的中位数或者是按y排序的点的中位数。

建树的复杂度是稳定O(nlogn),可是查询就是大暴力了

把平面分成非常多个小平面后,相当于在平面上搜索剪枝。

kd树是一颗二叉树,假如我要查找离(a,b)近期的点,先依照x和y的划分,从kd树根节点出发走到(a,b)所在的平面,然后这个平面中有一个点。通过这个点。就能大致确定近期点的半径范围了。再看这个圈是否和其它的平面有相交部分,假设有,相同的也訪问其它平面部分(说白了就是暴搜。是不是非常暴力。。

求第k近临时还没学会,仅仅学会了求近期。。

#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <cstdio>
#include <cctype>
#include <string>
#include <vector>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <functional>
#define fuck(x) cout<<"["<<x<<"]"
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII; const int MX = 1e5 + 5; struct Point {
int xy[2], l, r, id;
void read(int i) {
id = i;
scanf("%d%d", &xy[0], &xy[1]);
}
} P[MX];
int cmpw; LL ans;
int idx[MX]; bool cmp(const Point &a, const Point &b) {
return a.xy[cmpw] < b.xy[cmpw];
}
int build(int l, int r, int w) {
int m = (l + r) >> 1; cmpw = w;
nth_element(P + l, P + m, P + 1 + r, cmp);
idx[P[m].id] = m;
P[m].l = l != m ? build(l, m - 1, !w) : 0;
P[m].r = r != m ? build(m + 1, r, !w) : 0;
return m;
}
LL dist(LL x, LL y = 0) {
return x * x + y * y;
}
void query(int rt, int w, LL x, LL y) {
LL temp = dist(x - P[rt].xy[0], y - P[rt].xy[1]);
if(temp) ans = min(ans, temp);
if(P[rt].l && P[rt].r) {
bool sign = !w ? (x <= P[rt].xy[0]) : (y <= P[rt].xy[1]);
LL d = !w ? dist(x - P[rt].xy[0]) : dist(y - P[rt].xy[1]);
query(sign ? P[rt].l : P[rt].r, !w, x, y);
if(d < ans) query(sign ? P[rt].r : P[rt].l, !w, x, y);
} else if(P[rt].l) query(P[rt].l, !w, x, y);
else if(P[rt].r) query(P[rt].r, !w, x, y);
} int main() {
int T, n; //FIN;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = 1; i <= n; i++) P[i].read(i);
int rt = build(1, n, 0);
for(int i = 1; i <= n; i++) {
ans = 1e18;
query(rt, 0, P[idx[i]].xy[0], P[idx[i]].xy[1]);
printf("%I64d\n", ans);
}
}
return 0;
}

kd树 hdu2966 In case of failure的更多相关文章

  1. HDU2966 In case of failure(浅谈k-d tree)

    嘟嘟嘟 题意:给定\(n\)个二维平面上的点\((x_i, y_i)\),求离每一个点最近的点得距离的平方.(\(n \leqslant 1e5\)) 这就是k-d tree入门题了. k-d tre ...

  2. hdu 2966 In case of failure k-d树

    题目链接 给n个点, 求出每个点到离它最近的点的距离. 直接建k-d树然后查询就可以  感觉十分神奇... 明白了算法原理但是感觉代码还不是很懂... #include <bits/stdc++ ...

  3. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  4. K-D树

    一般用来解决各种二维平面的点对统计,也许一般非正解? 没时间慢慢写了,打完这个赛季后补细节 建树板子: #include <cstdio> #include <locale> ...

  5. 2016 ICPC青岛站---k题 Finding Hotels(K-D树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5992 Problem Description There are N hotels all over ...

  6. k近邻法的C++实现:kd树

    1.k近邻算法的思想 给定一个训练集,对于新的输入实例,在训练集中找到与该实例最近的k个实例,这k个实例中的多数属于某个类,就把该输入实例分为这个类. 因为要找到最近的k个实例,所以计算输入实例与训练 ...

  7. bzoj 3053 HDU 4347 : The Closest M Points kd树

    bzoj 3053 HDU 4347 : The Closest M Points  kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差 ...

  8. HDU 5809 Ants(KD树+并查集)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5809 [题目大意] 给出一些蚂蚁和他们的巢穴,一开始他们会在自己的巢穴(以二维坐标形式给出),之后 ...

  9. <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...

随机推荐

  1. vs2008控件查看器

    使用 OLE/COM 对象查看器 通过读取控件的类型库,OLE/COM 对象查看器使您得以查看控件的接口. 使用 OLE/COM 对象查看器 单击“工具”菜单上的“OLE/COM 对象查看器”或在命令 ...

  2. 制作SD更新系统时和用mfgtool工具烧录时,文件如何替换?

    制作SD更新系统时和用mfgtool工具烧录时,文件如何替换? 答:制作SD更新系统时,请按照需求选择不同mfgimages-myd*文件夹.每个文件夹里面有一个Manifest文件, 里面规定了ub ...

  3. 多线程test

    import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import ...

  4. win10 配置系统默认utf-8编码

    win10 配置系统默认utf-8编码 系统  win10 配置系统默认utf-8编码 Windows系统默认字符编码为gbk编码,开发项目编码一般为UTF-8,在我们执行程序及进行程序编码过程中编码 ...

  5. C++ new delete(一)

    在C#.Java這種managed語言,因為有garbage collection,所以完全不用考慮free()或delete,但在C/C++,有時候要delete的,有時又不用,到底哪些改delet ...

  6. 洛谷—— P1268 树的重量

    P1268 树的重量 构造类题目,看不出个所以然来... emmm,只好看题解: 只有两个点,那一条路径就是$ans$ 考虑三个点,那么$3$这个点相对于树上的路径(已经加入树上的边的距离) 为:$( ...

  7. terminology(术语)

    1.declaration:告诉编译器某个标识符的name和type,同时略去具体细节. extern int x;     //对象(object)声明式 std::size_t  numDigit ...

  8. python re 正则表达式

    元字符和其含义 . 匹配除换行符以外的任意字符 \ 转义字符,使后一个字符改变原来的意思 \w 匹配字母.数字.下划线:[A-Za-z0-9_] \W 匹配特殊字符:[^A-Za-z0-9_] \s ...

  9. solr中的Tokenizer Filter

    Tokenizer Tokenizer 的工作是将文本流分解为令牌,其中每个令牌(通常)是文本中字符的子序列.分析器知道它配置的字段,但 tokenizer 不是.Tokenizers 从字符流(Re ...

  10. 小白菜OJ 1122 公牛母牛配(最大二分图匹配模板)

    题意: n只公牛和m只母牛,某些公牛和某些母牛互相喜欢.但最后一只公牛只能和一只母牛建立一对一匹配.要使得最后牛群匹配对数最大. 链接: http://caioj.cn/problem.php?id= ...