【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 ...
随机推荐
- 实现斐波拉契数列的四种方式python代码
斐波那契数列 1. 斐波拉契数列简介 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引 ...
- 6-8 Percolate Up and Down(20 分)
Write the routines to do a "percolate up" and a "percolate down" in a binary min ...
- Jenkins搭建windows service自动编译发布环境
类库项目(Task)部署 前面搭建了Web站点的环境,类库项目发布不同于站点项目,它只需要将MSBuild编译出来的dll复制到目标服务器上即可,而不需要通过Web Deploy,下面来说一下如何发布 ...
- [BZOJ3470]Freda’s Walk
bzoj description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一张\(n\)个点.\(m\)边的有向 ...
- vue.js权威指南----代码解释实例
1:P61(值绑定) <input type="checkbox" v-model="toggle" :true-value="a" ...
- koa/koa2项目搭建
一键生成koa/koa2项目: 1. npm install -g koa-generator 2.新建项目目录 koa mytest (koa1项目) koa2 koa2test (koa2项目) ...
- ARM汇编返回指令
[ 588.756226] task: ffff000008a22f80 task.stack: ffff000008a10000 [ 588.762153] PC is at vb2_buffer_ ...
- Minio Bucket 通知试用&&说明
kafka 安装 docker run -p 2181:2181 -p 9092:9092 \ --name kafka --rm \ --env ADVERTISED_HOST=HOSTIP \ - ...
- Jacoco+Jenkines小白之路
Jacoco+Jenkines小白之路 最近工作中正在推广jacoco的增量覆盖率的统计,想学习一波,纯粹采坑中,适合小白学习jacoco. 一.代码覆盖率 引入代码覆盖率 : 代码覆盖率是指对现有代 ...
- Mybatis 插件实现动态设置参数
原文地址:Mybatis 插件实现动态设置参数 博客地址:http://www.extlight.com 一.背景 笔者在搭建架构时,通常会利用泛型对 dao 层 和 service 层公共的代码(增 ...