hdu 4347 The Closest M Points(KD树)
一道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 ...
随机推荐
- E浏览器常见的9个css Bug以及解决办法
我们在浏览网页的时候经常看见这样的现象:某个网页在IE6浏览器中打开很正常,但是在IE8里面打开可能完全变形了.或者也有可能出现完全相反的现象.这让Web程序员及设计师往往为了其CSS在各个IE版本下 ...
- hystrix熔断器
在一个具有多服务的应用中,假如由于其中某一个服务出现问题,导致响应速度变慢,或是根本没有响应返回,会导致它的服务消费者由于长时间的等待,消耗尽线程,进而影响到对其他服务的线程调用,进而会转变为整个应用 ...
- TYVJ2032 「Poetize9」升降梯上
P2032 「Poetize9」升降梯上 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道, ...
- python中星号
第一种情况:用在两表达式的中间,*表示乘法,**表示取幂,如: 1 2 3 4 >>> 2*5 10 >>> 2**7 128 第二种情况:用在变量的前面. 1,向 ...
- Mybatis错误:Result Maps collection already contains value for ***
[转载]原文链接:https://blog.csdn.net/maoyuanming0806/article/details/77870345 使用mybatis时,服务器启动时出错 严重: Exce ...
- Django用户登陆以及跳转后台管理页面3
Django用户登陆以及跳转后台管理页面1http://www.cnblogs.com/ujq3/p/7891774.html Django用户登陆以及跳转后台管理页面2http://www.cnbl ...
- 一个不错的插件(软件).NET开发
http://www.gcpowertools.com.cn/products/default.htm 葡萄城 先记录一下!
- ChaosBlade 发布对 C++ 应用混沌实验的支持
前言 为满足 C++ 应用系统故障演练,阿里妈妈安全生产团队开源了 C++ 混沌实验执行器,填补了 C++ 应用混沌工程实验的空白,其遵循<混沌实验模型>,可通过 ChaosBlade 工 ...
- JetBrains 系列软件--操作数据库+centos系统
这系列软件贼强大! 能操作数据库 也能操作centos(linux)系统 由于这系列都有这两个功能,下面以最近常用的JetBrains PhpStorm 2017.2.1 x64来举例子: 一.操作数 ...
- 【数论】如何证明gcd/exgcd
我恨数论 因为打这篇的时候以为a|b是a是b的倍数,但是懒得改了,索性定义 a|b 为 a是b的倍数 咳咳,那么进入正题,如何证明gcd,也就是 gcd(a,b) = gcd(b,a%b)? 首先,设 ...