Problem - 4347

  一道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树)的更多相关文章

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

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

  2. hdu 4347 The Closest M Points (kd树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4347 题意: 求k维空间中离所给点最近的m个点,并按顺序输出  . 解法: kd树模板题 . 不懂kd树的可以先看看这个 . 不多说, ...

  3. 数据结构(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 ...

  4. HDU 4347 - The Closest M Points - [KDTree模板题]

    本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...

  5. HDU 4347 The Closest M Points (kdTree)

    赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...

  6. 【HDOJ】4347 The Closest M Points

    居然是KD解. /* 4347 */ #include <iostream> #include <sstream> #include <string> #inclu ...

  7. BZOJ 3053: The Closest M Points(K-D Tree)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1235  Solved: 418[Submit][Status][Discuss] Descripti ...

  8. [hdu4347]The Closest M Points(线段树形式kd-tree)

    解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...

  9. BZOJ3053:The Closest M Points(K-D Teee)

    Description The course of Software Design and Development Practice is objectionable. ZLC is facing a ...

随机推荐

  1. Python之路,Day5 - 常用模块学习 (转载Alex)

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  2. <a>标签操作

    1.点击后onclick事件失效,变灰,不可用 onclick(this); //事件传递this对象 function viewMm(obj) { $(obj).removeAttr("o ...

  3. linux系统服务

    系统服务分类,根据其使用的方法来分,可以被分为三类 a.由init控制的服务:基本都是系统级别的服务,运行级别这一章讲的就是这一类的服务 b.由System V启动脚本启动的服务:和我们打交道最多的一 ...

  4. Ubuntu小知识:更改主机名

    Linux主机名是在安装Linux操作系统的过程中设定的,并作为网络中的某一台主机的唯一标志,但是在安装好Linux系统后,如果想修改主机名,该怎么办呢?本文介绍基于Ubuntu Desktop 9. ...

  5. 【水滴石穿】github_popular

    项目不难,就是文件摆放位置跟别的不一样 https://github.com/chenji336/github_popular //定义入口是app.js ///** @format */ impor ...

  6. typeof与js数据类型

    js有6种数据类型有null.undefied.string.number.boolean.object. 然而我之前的[误区]: typeof的返回值和JS的数据类型是一样的.但是并不是(⊙o⊙)哦 ...

  7. 去掉goland中间的令人烦躁的竖线

    去掉“configured in code Style options”前面的勾即可.

  8. Promise https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

    在JavaScript的世界中,所有代码都是单线程执行的. 由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行.异步执行可以用回调函数实现: function ca ...

  9. 【JZOJ4934】【NOIP2017GDKOI模拟1.12】a

    helpless fucking 结论:如果一个数可以被对于a序列中每个数的最大公约数整除,那么它就是好的. Bitch Man 感性证明: 贪心地想,对于a序列中的任意两个数,它们的最大公约数可由这 ...

  10. Directx11 教程(2) 基本的windows应用程序框架(2)

    原文:Directx11 教程(2) 基本的windows应用程序框架(2)      在本教程中,我们把前面一个教程的代码,进行封装.把初始化函数,Run函数,窗口回调函数,ShutdownWind ...