【hdu4347】The Closest M Points 【KD树模板】
题意
一个k维空间,给出n个点的坐标,给出t个询问,每个询问给出一个点的坐标和一个m。对于每个询问找出跟这个点最接近的m个点
分析
kd树的模板题。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue> using namespace std;
typedef long long LL;
const int maxn=;
const int K=;
int num,nownum,m;
LL ans;
struct kdNode{
LL x[K];
int div;
bool lef;
}Ans[];
struct Node{
kdNode a;
LL dis;
bool operator <(const Node &a)const{
return dis<a.dis;
}
Node(){}
Node(kdNode &tmp,LL d){
a=tmp;
dis=d;
}
};
int cmpNo;
bool cmp(kdNode a,kdNode b){
return a.x[cmpNo]<b.x[cmpNo];
}
inline LL max(LL a,LL b){//why?
return a>b?a:b;
}
kdNode p[maxn],q;
LL dis(kdNode a,kdNode b,int k){
LL res=;
for(int i=;i<k;i++){
res+=(a.x[i]-b.x[i])*(a.x[i]-b.x[i]);
}
return res;
}
priority_queue<Node>qq;
void buildKD(int l,int r,kdNode* p,int d,int k){
if(l>r)return ;
int m=(l+r)/;
cmpNo=d;
nth_element(p+l,p+m,p+r+,cmp);
p[m].div=d;
if(l==r){
p[m].lef=;
return ;
}
buildKD(l,m-,p,(d+)%k,k);
buildKD(m+,r,p,(d+)%k,k);
}
void findkd(int l,int r,kdNode& tar,kdNode* p,int k){
if(l>r)return;
int m=(l+r)/;
LL d=dis(p[m],tar,k);
if(p[m].lef){
if(nownum<num){
nownum++;
ans=max(ans,d);
qq.push(Node(p[m],d));
}
else if(ans>d){
qq.pop();
qq.push(Node(p[m],d));
ans=qq.top().dis;
}
return;
}
LL t=tar.x[p[m].div]-p[m].x[p[m].div];
if(t>){
findkd(m+,r,tar,p,k);
if(nownum<num){
qq.push(Node(p[m],d));
nownum++;
ans=qq.top().dis;
findkd(l,m-,tar,p,k);
}else{
if(ans>d){
qq.pop();
qq.push(Node(p[m],d));
ans=qq.top().dis;
}
if(ans>t*t)
findkd(l,m-,tar,p,k);
}
}else{
findkd(l,m-,tar,p,k);
if(nownum<num){
qq.push(Node(p[m],d));
nownum++;
ans=qq.top().dis;
findkd(m+,r,tar,p,k);
}else{
if(ans>d){
qq.pop();
qq.push(Node(p[m],d));
ans=qq.top().dis;
}
if(ans>t*t){
findkd(m+,r,tar,p,k);
}
}
}
} int n,k;
int main(){
while(scanf("%d%d",&n,&k)==){
for(int i=;i<n;i++){
for(int j=;j<k;j++){
scanf("%lld",&p[i].x[j]);
}
p[i].lef=;
}
buildKD(,n-,p,k-,k);
int t;
scanf("%d",&t);
for(int i=;i<=t;i++){
ans=-;
nownum=;
for(int j=;j<k;j++){
scanf("%lld",&q.x[j]);
}
while(!qq.empty())qq.pop();
scanf("%d",&num);
findkd(,n-,q,p,k);
for(int j=;j<=num;j++){
Ans[j]=qq.top().a;
qq.pop();
}
printf("the closest %d points are:\n",num);
for(int j=num;j>=;j--){
for(int kk=;kk<k;kk++){
if(kk==)
printf("%lld",Ans[j].x[kk]);
else
printf(" %lld",Ans[j].x[kk]);
}
printf("\n");
}
}
}
return ;
}
【hdu4347】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树的可以先看看这个 . 不多说, ...
- [hdu4347]The Closest M Points(线段树形式kd-tree)
解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...
- [hdu4347]The Closest M Points(平衡树式kdtree)
解题关键:模板题(结合起来了) #include<iostream> #include<cstdio> #include<cstring> #include< ...
- BZOJ3053:The Closest M Points(K-D Teee)
Description The course of Software Design and Development Practice is objectionable. ZLC is facing a ...
- BZOJ 3053: The Closest M Points(K-D Tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1235 Solved: 418[Submit][Status][Discuss] Descripti ...
- k-d树模板(BZOJ2648)
实现了插入一个点,查询距某个位置的最近点. #include <cstdio> #include <algorithm> using namespace std; , inf ...
- tju_4147 kd树+最小生成树
kd树模板+全图最小生成树 标签(空格分隔): kd树+最小生成树 题目链接 题意: k维太空中有n个点,每个点可以与距离它m近的点连边,现在给你一堆点,并给出坐标,现在要建立通信网络,一些可以互相到 ...
- HDU 5992 Finding Hotels(KD树)题解
题意:n家旅店,每个旅店都有坐标x,y,每晚价钱z,m个客人,坐标x,y,钱c,问你每个客人最近且能住进去(非花最少钱)的旅店,一样近的选排名靠前的. 思路:KD树模板题 代码: #include&l ...
随机推荐
- SpringMvc中的Interceptor拦截器的学习
拦截器是SpringMvc框架中常用的一个东东,它跟Filter相似,但是也有区别,以前也没用过,今天看到就顺便学习了一下. SpirngMvc中的Interceptor主要是通过HandlerInt ...
- CAM350对比两个gerber之间的差异
今天客供的gerber 版本更新,要检查区别. 参考: https://wenku.baidu.com/view/a154028c19e8b8f67d1cb93f.html 这个更加详细: https ...
- adb命令安装apk
1.将需要安装的apk放在platform-tools下 2.将手机和电脑连接,在cmd中输入 adb devices查看 3.使用adb命令安装apk,在cmd中输入:adb install apk ...
- Oracle 分析函数及常用函数
什么叫分析函数(Analytic function)? Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组 ...
- ZetCode PyQt4 tutorial signals and slots
#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, ...
- opencv之读取pts文件
#include <iostream> #include <fstream> #include <opencv2/opencv.hpp> using namespa ...
- 日志异常:java.lang.NoClassDefFoundError: Could not initialize class org.slf4j.impl.StaticLoggerBinder
今天启动开发的项目,碰到了一个日志上的bug:java.lang.NoClassDefFoundError: Could not initialize class org.slf4j.impl.Sta ...
- pe如何安装ios系统
1.进PE系统(老毛桃) 2.虚拟光驱加载ios系统 3.然后打开我的电脑,里面有个光盘,就像光盘插在光驱里打开电脑后的样子,双击安装系统.
- windows 不能在本地计算机启动SqlServer. 参考特定服务错误代码10048
这一般都是由于Sql Server的端口号被其他应用程序占用导致的,可以使用dos命令或者网络工具查看当前端口的使用情况,看看哪个程序占用了Sql Server的默认端口1433,将这个程序结束就可以 ...
- mongodb,redis,mysql的区别和具体应用场景
一.MySQL 关系型数据库. 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点就 ...