一道KNN的题。直接用kd树加上一个暴力更新就撸过去了。写的时候有一个错误就是搜索一边子树的时候返回有当前层数会被改变了,然后就直接判断搜索另一边子树,搞到wa了半天。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector> using namespace std; const int K = ;
const int N = ;
int dm, cdm;
template<class T> T sqr(T x) { return x * x;}
struct Node {
int x[K];
Node *c[];
bool operator < (Node a) const {
for (int i = ; i < dm; i++) if (x[(cdm + i) % dm] != a.x[(cdm + i) % dm]) return x[(cdm + i) % dm] < a.x[(cdm + i) % dm];
return true;
}
} node[N]; int dist(Node *a, Node *b) {
int ret = ;
for (int i = ; i < dm; i++) ret += sqr(a->x[i] - b->x[i]);
return ret;
} struct KDT {
Node *knn[];
int top, dis[], sz;
Node *RT;
void build(int l, int r, int dp, Node *&rt) {
cdm = dp % dm;
if (l > r) { rt = NULL; return ;}
int m = l + r >> ;
nth_element(node + l, node + m, node + r + );
rt = node + m;
build(l, m - , dp + , rt->c[]);
build(m + , r, dp + , rt->c[]);
}
void build(int l, int r) {
sz = r - l + ;
build(l, r, , RT);
}
void search(int dp, Node *x, Node *rt, int k) {
if (!rt) return ;
cdm = dp % dm;
int d = dist(x, rt), p = top;
while (p >= && d < dis[p]) dis[p + ] = dis[p], knn[p + ] = knn[p], p--;
p++;
dis[p] = d;
knn[p] = rt;
if (top + < k) top++;
bool r = x->x[cdm] >= rt->x[cdm];
search(dp + , x, rt->c[r], k);
cdm = dp % dm;
if (top + < k || sqr(rt->x[cdm] - x->x[cdm]) < dis[top]) search(dp + , x, rt->c[!r], k);
}
void search(Node *x, int k) {
top = -;
search(, x, RT, k);
}
void pre(Node *x) {
if (!x) return ;
pre(x->c[]);
cout << x->x[] << ' ' << x->x[] << endl;
pre(x->c[]);
}
} kdt; int main() {
int n, m, k;
Node tmp;
while (~scanf("%d%d", &n, &dm)) {
for (int i = ; i < n; i++) {
for (int j = ; j < dm; j++) scanf("%d", node[i].x + j);
node[i].c[] = node[i].c[] = NULL;
}
kdt.build(, n - );
scanf("%d", &m);
while (m--) {
for (int i = ; i < dm; i++) scanf("%d", tmp.x + i);
scanf("%d", &k);
kdt.search(&tmp, k);
printf("the closest %d points are:\n", k);
for (int i = ; i <= kdt.top; i++) {
for (int j = ; j < dm; j++) {
if (j) putchar(' ');
printf("%d", kdt.knn[i]->x[j]);
}
puts("");
}
}
}
return ;
}
——written by Lyon
hdu 4347 The Closest M Points(KD树)的更多相关文章
-
bzoj 3053 HDU 4347 : The Closest M Points kd树
bzoj 3053 HDU 4347 : The Closest M Points kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差 ...
-
hdu 4347 The Closest M Points (kd树)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4347 题意: 求k维空间中离所给点最近的m个点,并按顺序输出 . 解法: kd树模板题 . 不懂kd树的可以先看看这个 . 不多说, ...
-
数据结构(KD树):HDU 4347 The Closest M Points
The Closest M Points Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 98304/98304 K (Java/Ot ...
-
HDU 4347 - The Closest M Points - [KDTree模板题]
本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...
-
HDU 4347 	The Closest M Points (kdTree)
赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...
-
【HDOJ】4347 The Closest M Points
居然是KD解. /* 4347 */ #include <iostream> #include <sstream> #include <string> #inclu ...
-
BZOJ 3053: The Closest M Points(K-D Tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1235 Solved: 418[Submit][Status][Discuss] Descripti ...
-
[hdu4347]The Closest M Points(线段树形式kd-tree)
解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...
-
BZOJ3053:The Closest M Points(K-D Teee)
Description The course of Software Design and Development Practice is objectionable. ZLC is facing a ...
随机推荐
-
webpack配置ES6 + react套装开发
配置ES6 1.安装插件: babel-loader,babel-preset-es2015,babel-preset-react. 2.添加配置文件中部分内容: { test: /\.js$/, l ...
-
sql创建表格 转载
http://blog.csdn.net/wuxiaokaixinguo/article/details/8293048 检查数据库中是否存在某个表,不存在则生成该表方法一:IF NOT EXISTS ...
-
Amoeba:开源的分布式数据库Porxy解决方案
http://www.biaodianfu.com/amoeba.html 什么是Amoeba? Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件 ...
-
WP8_定位新页面中listbox的某项
即将跳转到页面A,在页面A中有一个listbox,在跳转的时候,接收参数,自动选中listbox中的某项 /// <summary> /// 接收参数,定位当前选中项 /// </s ...
-
WWDC2015—图解
-
HDU 1540 Tunnel Warfare(经典)(区间合并)【线段树】
<题目链接> 题目大意: 一个长度为n的线段,下面m个操作 D x 表示将单元x毁掉 R 表示修复最后毁坏的那个单元 Q x 询问这个单元以及它周围有多少个连续的单元,如果它本身已经被 ...
-
Win8驱动的兼容性问题
引用注明>> [作者:张佩][原文:www.yiiyee.cn/blog] 最近我发现为Win8开发的驱动程序,有些能安装在Win7上(包括更早系统),有些则不能.那些不能安装的情况很可怕 ...
-
MVC EF 执行SQL语句(转载)
MVC EF 执行SQL语句 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 闲着没事,看了一篇关于LI ...
-
小朋友学C语言(4):单精度浮点数与双精度浮点数
上节课简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的单 ...
-
./adb: error while loading shared libraries: libncurses.so.5:
from://http://*.com/questions/10005907/eclipse-android-plugin-libncurses-so-5 sudo apt-g ...