hud 4347 The Closest M Points(KD-Tree)
解题思路
\(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割。它的插入删除复杂度为\(log^2 n\),它查询最近点对的复杂度为\(O(n^{\frac{k-1}{k}}\),\(k\)代表维数。用堆维护最近点,查询时就先找到它属于的区域,然后回溯时判断一下它到父节点的距离和堆顶的大小,如果比堆顶还大就不递归它的兄弟节点。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
const int N=50005;
inline int rd(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
}
inline int pw(int x){
return x*x;
}
int n,q,K,t;
struct Node{
int a[7];
void init() {
memset(a,0,sizeof(a));
}
friend bool operator<(const Node A,const Node B){
return A.a[t]<B.a[t];
}
}node[N],pt[N<<2],ans[25];
priority_queue<pair<double,Node> > Q;
struct KD_Tree{
#define mid ((l+r)>>1)
int end[N<<2];
void build(int x,int l,int r,int dep){
if(l>r) return; t=dep%K;
end[x]=0; end[x<<1]=end[x<<1|1]=1;
nth_element(node+l,node+mid,node+r+1);
pt[x]=node[mid];
build(x<<1,l,mid-1,dep+1); build(x<<1|1,mid+1,r,dep+1);
}
void query(int x,int dep,int lim,Node now){
if(end[x]) return;
pair<double,Node> tmp=make_pair(0,pt[x]);
for(int i=0;i<K;i++) tmp.first+=pw(pt[x].a[i]-now.a[i]);
int ls=x<<1,rs=x<<1|1,t=dep%K,flag=0;
if(now.a[t]>=pt[x].a[t]) swap(ls,rs);
if(!end[ls]) query(ls,dep+1,lim,now);
if(Q.size()<lim) Q.push(tmp),flag=1;
else {
if(Q.top().first>tmp.first) Q.pop(),Q.push(tmp);
if(pw(pt[x].a[t]-now.a[t])<Q.top().first) flag=1;
}
if(!end[rs] && flag) query(rs,dep+1,lim,now);
}
#undef mid
}tree;
int main(){
while(~scanf("%d%d",&n,&K)){
for(int i=1;i<=n;i++)
for(int j=0;j<K;j++) node[i].a[j]=rd();
tree.build(1,1,n,0);
for(q=rd();q;q--){
Node now; now.init();
for(int i=0;i<K;i++) now.a[i]=rd();
int t=rd(); tree.query(1,0,t,now);
for(int i=1;!Q.empty();i++)
ans[i]=Q.top().second,Q.pop();
printf("the closest %d points are:\n",t);
for(int i=t;i;i--){
printf("%d",ans[i].a[0]);
for(int j=1;j<K;j++)
printf(" %d",ans[i].a[j]);
putchar('\n');
}
}
}
return 0;
}
hud 4347 The Closest M Points(KD-Tree)的更多相关文章
- bzoj 3053 HDU 4347 : The Closest M Points kd树
bzoj 3053 HDU 4347 : The Closest M Points kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差 ...
- BZOJ 3053: The Closest M Points(K-D Tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1235 Solved: 418[Submit][Status][Discuss] Descripti ...
- hdu 4347 The Closest M Points (kd树)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4347 题意: 求k维空间中离所给点最近的m个点,并按顺序输出 . 解法: kd树模板题 . 不懂kd树的可以先看看这个 . 不多说, ...
- hdu 4347 The Closest M Points(KD树)
Problem - 4347 一道KNN的题.直接用kd树加上一个暴力更新就撸过去了.写的时候有一个错误就是搜索一边子树的时候返回有当前层数会被改变了,然后就直接判断搜索另一边子树,搞到wa了半天. ...
- 数据结构(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 ...
- 【HDOJ】4347 The Closest M Points
居然是KD解. /* 4347 */ #include <iostream> #include <sstream> #include <string> #inclu ...
- HDU 4347 - The Closest M Points - [KDTree模板题]
本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...
- BZOJ3053:The Closest M Points(K-D Teee)
Description The course of Software Design and Development Practice is objectionable. ZLC is facing a ...
- HDU 4347 The Closest M Points (kdTree)
赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...
随机推荐
- Microsoft SQL Server 2008 R2官方中文版(SQL2008下载)
Microsoft SQL Server 2008 R2官方中文版(SQL2008下载) http://www.2cto.com/database/201308/235349.html
- Beetle简单构建TCP服务
使用Beetle构建TCP服务应用是件非常简单的事情,它并不需要你去关注Socket细节,如果你想用Socket编写高性能的TCP服务,那你要关注的东西非常多,异步数据处理,大量连接下的线程管理和连接 ...
- Arduino入门之前
胡乱乱的,就买了,这个 arduino的板子. 哎...本来明明是 学动漫的,然后 不小心就开始 做软件了,然后 越跑越偏...现在 开始 做 硬件开发了... 其实 还有 树莓派 可供选择,算了,不 ...
- Proteus报错处理经验:power rails ‘GND’ and 'VCC/VDD' are interconnected in net VCC
1 前言 初学Proteus,画好原理图后遇到了power rails 'GND' and 'VCC/VDD' are interconnected in net VCC的报错. 尝试了网上的解决办法 ...
- 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)
科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...
- ecshop 2.7 PC 微信扫描支付配置教程
在ecshop支付过程中,有些是没有微信支付的,需要自己添加微信支付的模块,那么怎么添加呢,添加过程需要调试,本人花了很长时间才调试成功的pc微信扫描支付, 1,数据库添加微信支付方模块 2,后台设置 ...
- 1897. tank 坦克游戏
传送门 显然考虑 $dp$,发现时间只和当前位置和攻击次数有关,设 $F[i][j][k]$ 表示当前位置为 $i,j$ ,攻击了 $k$ 次得到的最大分数 初始 $f[1][1][k]$ 为位置 $ ...
- P3452 [POI2007]BIU-Offices
传送门 首先能想到 $n^2$ 的做法 枚举所有两点,看看是否有边相连,如果没有说明它们一定要在同一集合,用并查集维护一下就行 注意到如果没有边这个条件,其实就相当于问补图有边 所以题意可以转化为,求 ...
- React框架新闻网站学习过程中遇到的错误总结
1.安装指定版本插件命令 npm install 插件名字@1.1.4(版本号) --save 或 yarn add 插件名字@1.1.4(版本号) --dev 2.Error:‘Link’ is n ...
- 前端开发HTML&css入门——盒子模型以及部分CSS样式
CSS处理网页时,它认为每个元素都包含在一个不可见的盒子里.• 为什么要想象成盒子呢?因为如果把所有的元素都想象成盒子,那么我们对网页的布局就相当于是摆放盒子.• 我们只需要将相应的盒子摆放到网页中相 ...