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. 破逼Json,该死的Json库,操了

    jansson,就这个库,破几把玩意,本来很简单的Json,就是简单的字符串操作,ATL一个CString就能解决,QT的QSting也能解决,DELPHI的String也能解决.而这B,非把那么简单 ...

  2. Promise对象和async函数

    Promise对象 //1开始 function fna(){ console.log('1开始'); var p = new Promise(function(resolve, reject){ / ...

  3. tcpdump的表达式介绍

    表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获.如果没有给出任何条件,则网络上所有的信息包 将会被截获. 在表达式中一般如下几种类 ...

  4. arcgis点密度专题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. 修改Eclipse自动换行长度

    使用Ctrl+Shift+F自动格式化代码的时候,有时候折行太多反而让代码看起来更乱,不容易阅读. 解决办法: Window-->Preferences-->Java-->Code ...

  6. ORACLE常用的环境变量

    ORACLE_HOME:将要安装oracle软件的目录,指向oracle二进制文件应该安装到的位置. ORACLE_BASE:主机服务器上用于oracle软件的顶级目录 ORACLE_SID:定义一个 ...

  7. TyvjP1266 费解的开关

    P1266 费解的开关 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏 ...

  8. Leetcode3.Longest Substring Without Repeating Characters无重复字符的最长字串

    给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...

  9. Directx11教程(50) 输出depth/stencil buffer的内容

    原文:Directx11教程(50) 输出depth/stencil buffer的内容      有时候,我们需要查看depth/stencil buffer的内容,比如上一章中,我们要查看sten ...

  10. Directx11教程(15) D3D11管线(4)

    原文:Directx11教程(15) D3D11管线(4) 本章我们首先了解一下D3D11中的逻辑管线,认识一下管线中每个stage的含义. 参考资料:http://fgiesen.wordpress ...