BZOJ 3053 The Closest M Points
【题目分析】
典型的KD-Tree例题,求k维空间中的最近点对,只需要在判断的过程中加上一个优先队列,就可以了。
【代码】
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 1000005
#define inf (0x3f3f3f3f)
#define mk(a,b) make_pair(a,b)
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int D,rt,n,base,m,x;
struct node{
int d[6],mx[6],mn[6],l,r;
int operator [] (int x) {return d[x];}
void init() {for (int i=0;i<base;++i) d[i]=read();}
}t[maxn],now;
bool operator < (node a,node b) {return a[D]<b[D];}
void update(int k)
{
for (int i=0;i<base;++i)
{
t[k].mn[i]=min(t[k][i],min(t[t[k].l].mn[i],t[t[k].r].mn[i]));
t[k].mx[i]=max(t[k][i],max(t[t[k].l].mx[i],t[t[k].r].mx[i]));
}
}
int build(int l,int r,int dir)
{
D=dir;
int mid=(l+r)/2;
nth_element(t+l,t+mid,t+r+1);
for (int i=0;i<base;++i) t[mid].mn[i]=t[mid].mx[i]=t[mid][i];
if (l<mid) t[mid].l=build(l,mid-1,(dir+1)%base); else t[mid].l=0;
if (r>mid) t[mid].r=build(mid+1,r,(dir+1)%base); else t[mid].r=0;
update(mid);
return mid;
}
int dis(node a,node b)
{
int ret=0;
for (int i=0;i<base;++i)
ret+=(a[i]-b[i])*(a[i]-b[i]);
return ret;
}
pair <int,int> pa;
int ans[maxn];
priority_queue <pair<int,int> > q;
int getdis(int k)
{
if (!k) return inf;
int ret=0;
for (int i=0;i<base;++i)
if (now[i]<t[k].mn[i]) ret+=(t[k].mn[i]-now[i])*(t[k].mn[i]-now[i]);
for (int i=0;i<base;++i)
if (now[i]>t[k].mx[i]) ret+=(now[i]-t[k].mx[i])*(now[i]-t[k].mx[i]);
return ret;
}
void query(int k)
{
if (!k) return ;
int dl=getdis(t[k].l),dr=getdis(t[k].r),d0=dis(t[k],now);
if (d0<q.top().first) {q.pop(); q.push(mk(d0,k));}
if (dl<dr)
{
if (dl<q.top().first) query(t[k].l);
if (dr<q.top().first) query(t[k].r);
}
else
{
if (dr<q.top().first) query(t[k].r);
if (dl<q.top().first) query(t[k].l);
}
}
int main()
{
while (scanf("%d%d",&n,&base)!=EOF)
{
// memset(t,0,sizeof t);
// n=read(); base=read();
for (int i=0;i<base;++i) t[0].mn[i]=inf,t[0].mx[i]=-inf;
for (int i=1;i<=n;++i) t[i].init();
rt=build(1,n,0);
m=read();
while (m--)
{
now.init(); x=read();
for (int i=0;i<x;++i) q.push(mk(inf,0));
query(rt);
printf("the closest %d points are:\n",x);
for (int i=x;i>=1;--i) ans[i]=q.top().second,q.pop();
for (int i=1;i<=x;++i)
for (int j=0;j<base;++j)
printf("%d%c",t[ans[i]][j],j==base-1?'\n':' ');
}
}
}
BZOJ 3053 The Closest M Points的更多相关文章
- BZOJ 3053: The Closest M Points(K-D Tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1235 Solved: 418[Submit][Status][Discuss] Descripti ...
- bzoj 3053: The Closest M Points【KD-tree】
多维KDtree板子 左右儿子的估价用mn~mx当区间,假设区间里的数都存在:k维轮着做割点 #include<iostream> #include<cstdio> #incl ...
- 【BZOJ】3053: The Closest M Points(kdtree)
http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!! ...
- 【BZOJ】【3053】The Closest M Points
KD-Tree 题目大意:K维空间内,与给定点欧几里得距离最近的 m 个点. KD树啊……还能怎样啊……然而扩展到k维其实并没多么复杂?除了我已经脑补不出建树过程……不过代码好像变化不大>_&g ...
- 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
KDTree模板,在m维空间中找最近的k个点,用的是欧几里德距离. 理解了好久,昨晚始终不明白那些“估价函数”,后来才知道分情况讨论,≤k还是=k,在当前这一维度距离过线还是不过线,过线则要继续搜索另 ...
- The Closest M Points BZOJ 3053
The Closest M Points [问题描述] 软工学院的课程很讨厌!ZLC同志遇到了一个头疼的问题:在K维空间里面有许多的点,对于某些给定的点,ZLC需要找到和它最近的m个点. (这里的距离 ...
- 【kd-tree】bzoj3053 The Closest M Points
同p2626.由于K比较小,所以不必用堆. #include<cstdio> #include<cstring> #include<cmath> #include& ...
- 【HDOJ】4347 The Closest M Points
居然是KD解. /* 4347 */ #include <iostream> #include <sstream> #include <string> #inclu ...
随机推荐
- 【linux】linux下运行java程序
参考了http://www.cnblogs.com/howard-queen/archive/2012/01/30/2331795.html 第一步:用vim先写一个java程序 first.jav ...
- 【QT】自己生成ui加入工程
在三个月前 我就在纠结 C++ GUI Qt 4编程这本书中2.3节 快速设计对话框这一段. 按照书上的做没有办法生成能够成功运行的程序. 这两天又折腾了好久,终于成功了. 注意事项: 1. 我之前装 ...
- java获得本机IP,名称等
import java.net.InetAddress; import java.net.UnknownHostException; public class GetLocalIP { public ...
- IOS- 内存管理机制
iOS平台内存常见问题 作为iOS平台的开发者,是否曾经为内存问题而苦恼过?内存莫名的持续增长,程序莫名的crash,难以发现 的内存泄漏,这些都是iOS平台内存相关的常见问题:本文将会详细介绍iOS ...
- xmpp SASL 定义
SASL 定义 <摘抄自:xmpp_3920> [SASL]的 profiling 需求要求协议定义 供以下信息: 服务名:“xmpp” 初始序列:初始实体 供一个开放 XML 流头后,并 ...
- Python下安装MySQLdb
前提是你已经安装过mysql 1.从https://pypi.python.org/pypi/MySQL-python/下载MySQL-python,然后用rz命令上传到相关目录 2.用tar -zx ...
- tableView 局部刷新
//一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; [tableview reloadSections:in ...
- Eclipse 控制console
http://blog.csdn.net/leidengyan/article/details/5686691
- tomcat7源码编译过程以及问题解决
http://blog.csdn.net/kaoshangqinghua/article/details/40022315
- Python 自然语言处理(1) 计数词汇
Python有一个自然语言处理的工具包,叫做NLTK(Natural Language ToolKit),可以帮助你实现自然语言挖掘,语言建模等等工作.但是没有NLTK,也一样可以实现简单的词类统计. ...