kdtree讲解:

https://blog.csdn.net/qing101hua/article/details/53228668

https://blog.csdn.net/acdreamers/article/details/44664645

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4347

给你一堆点,每次查询给一个点求和这个点最近的m个点是什么(距离是欧氏距离)

裸的kdtree

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; int n,k,idx;
struct node{
int f[];
bool operator <(const node&rhs)const{
return f[idx]<rhs.f[idx];
}
}a[N];
priority_queue<pair<double,node> >q;
struct kdtree{
bool vis[N<<];
node date[N<<];
void build(int l,int r,int rt,int dep)
{
if(l>r)return ;
vis[rt]=;
vis[rt<<]=vis[rt<<|]=;
idx=dep%k;
int m=(l+r)>>;
nth_element(a+l,a+m,a+r+);
date[rt]=a[m];
build(l,m-,rt<<,dep+);
build(m+,r,rt<<|,dep+);
}
void query(node p,int m,int rt,int dep)
{
if(!vis[rt])return ;
printf("%d \n",rt);
pair<double,node>cur(,date[rt]);
for(int i=;i<k;i++)
cur.fi+=(cur.se.f[i]-p.f[i])*(cur.se.f[i]-p.f[i]);
int dim=dep%k;
bool fg=;
int x=rt<<,y=rt<<|;
if(p.f[dim]>=date[rt].f[dim])swap(x,y);
if(vis[x])query(p,m,x,dep+);
if(q.size()<m)q.push(cur),fg=;
else
{
if(cur.fi<q.top().fi)
{
q.pop();q.push(cur);
}
if((p.f[dim]-date[rt].f[dim])*(p.f[dim]-date[rt].f[dim])<q.top().fi)fg=;
}
if(vis[y]&&fg)query(p,m,y,dep+);
}
}kd;
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=;i<n;i++)
for(int j=;j<k;j++)
scanf("%d",&a[i].f[j]);
kd.build(,n-,,);
int t;scanf("%d",&t);
while(t--)
{
node p;
for(int i=;i<k;i++)scanf("%d",&p.f[i]);
int m;scanf("%d",&m);
while(!q.empty())q.pop();
// printf("%d\n",idx);
kd.query(p,m,,);
printf("the closest %d points are:\n",m);
node ans[];
for(int i=;!q.empty();i++)ans[i]=q.top().se,q.pop();
for(int i=m-;i>=;i--)
for(int j=;j<k;j++)
printf("%d%c",ans[i].f[j],j==k-?'\n':' ');
}
}
return ;
}
/*********************** ***********************/

hdu4347The Closest M Points kdtree的更多相关文章

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

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

  2. hud 4347 The Closest M Points(KD-Tree)

    传送门 解题思路 \(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割.它的插入删除复杂度为\(log^2 n\),它查 ...

  3. 【BZOJ】3053: The Closest M Points(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!! ...

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

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

  5. HDU 4347 The Closest M Points (kdTree)

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

  6. bzoj 3053: The Closest M Points【KD-tree】

    多维KDtree板子 左右儿子的估价用mn~mx当区间,假设区间里的数都存在:k维轮着做割点 #include<iostream> #include<cstdio> #incl ...

  7. 【kd-tree】bzoj3053 The Closest M Points

    同p2626.由于K比较小,所以不必用堆. #include<cstdio> #include<cstring> #include<cmath> #include& ...

  8. [hdu4347]The Closest M Points(平衡树式kdtree)

    解题关键:模板题(结合起来了) #include<iostream> #include<cstdio> #include<cstring> #include< ...

  9. 【BZOJ 3053】The Closest M Points

    KDTree模板,在m维空间中找最近的k个点,用的是欧几里德距离. 理解了好久,昨晚始终不明白那些“估价函数”,后来才知道分情况讨论,≤k还是=k,在当前这一维度距离过线还是不过线,过线则要继续搜索另 ...

随机推荐

  1. POJ1159:Palindrome(LCS小应用 回文)

    地址:http://poj.org/problem?id=1159 题目需求: 给你一个字符串,求最少添加多少字符可以使之构成回文串. 题目解析: 简单做法是直接对它和它的逆序串求最长公共子序列长度l ...

  2. vim符号列表

    Exuberant Ctags工具安装 • 软件简介 Ctags generates an index (or tag) file of language objects found in sourc ...

  3. Python的数据类型和常用方法大全

    数据类型 一.数字 整形int x=10 #x=int(10) print(id(x),type(x),x) 浮点型float salary=3.1 #salary=float(3.1) print( ...

  4. fir.im 测试包下载工具--FIRReader 的图文介绍

    fir.im 是一个供开发者上传测试包(也可以是企业的正式包)的网站.该网站提供了接口访问应用资源.下面要介绍的这个应用对接了这些接口,供用户方便下载应用. 先来看下应用截图吧! 主要有以下功能点:1 ...

  5. 前端使用canvas绘制立体三角形

    前端绘制立体效果的三角形的demo 在移动端使用时,需要自适应屏幕.canvas上无法设置rem,所以在canvas外加一个父级元素设置为rem,再将canvas的宽高设置为100% 100%. 如果 ...

  6. tomcat高并发配置调优

    最近部署的tomcat,里面放了一个apk提供给测试人员测试,而有一天压测的时候,他们一致反馈下载不了,结果查看日志才发现如下错误: [html] view plain copy INFO: Maxi ...

  7. iOS开发之JSONKit

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  8. oracle 分区表详解

    一.分区表的概述: Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任 ...

  9. 使用C++11实现一个半同步半异步线程池

    前言 C++11之前我们使用线程需要系统提供API.posix线程库或者使用boost提供的线程库,C++11后就加入了跨平台的线程类std::thread,线程同步相关类std::mutex.std ...

  10. Docker入门简明教程

    Docker简介 概念 Docker是基于Go语言实现的云开源项目,是基于Linux的多项开源技术提供高效.敏捷和轻量级的容器方案.创建于2013年初.自从开源后就受到了广泛的关注,从长远的眼光来看, ...