题解:

我们可以事先在堆里放入插入m个inf然后不断的比较当前值与堆首元素的大小,如果小于的话进入。

估计函数也可以随便写写。。。

query的时候貌似不用保留dir。。。

return 0写在 while 里面我也是醉了。。。

不用开long long为什么大家都开了。。。

k-d tree助我进第一版

代码:

 #include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 2100000000
#define maxn 100000+5
#define maxm 500+100
#define eps 1e-10
#define ll long long
#define sqr(x) (x)*(x)
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y;i;i=e[i].next)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,m,rt,cur,ans[];
struct rec
{
int d[],mi[],mx[],l,r;
int& operator[](int x){return d[x];}
}p[maxn],now,t[maxn];
priority_queue<pa>q;
bool operator <(rec a,rec b){return a[cur]<b[cur];}
inline void pushup(int k)
{
int l=t[k].l,r=t[k].r;
for0(i,m-)
{
t[k].mi[i]=min(t[k].mi[i],min(t[l].mi[i],t[r].mi[i]));
t[k].mx[i]=max(t[k].mx[i],max(t[l].mx[i],t[r].mx[i]));
}
}
int build(int l,int r,int dir)
{
int mid=(l+r)>>;
cur=dir;
nth_element(p+l,p+mid,p+r+);
t[mid]=p[mid];
for0(i,m-)t[mid].mx[i]=t[mid].mi[i]=t[mid][i];
t[mid].l=l<mid?build(l,mid-,(dir+)%m):;
t[mid].r=mid<r?build(mid+,r,(dir+)%m):;
pushup(mid);
return mid;
}
inline int dis(rec a,rec b)
{
int ret=;
for0(i,m-)ret+=sqr(a[i]-b[i]);
return ret;
}
inline int calc(int k)
{
if(!k)return inf;
int ret=;
for0(i,m-)if(now[i]<t[k].mi[i])ret+=sqr(t[k].mi[i]-now[i]);
for0(i,m-)if(now[i]>t[k].mx[i])ret+=sqr(now[i]-t[k].mx[i]);
return ret;
}
void query(int k)
{
int dl=calc(t[k].l),dr=calc(t[k].r),d0=dis(t[k],now);
if(d0<q.top().first){q.pop();q.push(pa(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()
{
freopen("input.in","r",stdin);
freopen("output.txt","w",stdout);
for0(i,)t[].mi[i]=inf,t[].mx[i]=-inf;
while(scanf("%d %d",&n,&m)!=EOF)
{
for1(i,n)for0(j,m-)p[i][j]=read();
rt=build(,n,);
int qq=read();
while(qq--)
{
for0(i,m-)now[i]=read();n=read();
printf("the closest %d points are:\n",n);
for1(i,n)q.push(pa(inf,));
query(rt);
for1(i,n)ans[i]=q.top().second,q.pop();
for3(i,n,){for0(j,m-){if(j)printf(" ");printf("%d",t[ans[i]][j]);}printf("\n");}
}
}
return ;
}

BZOJ3053: The Closest M Points的更多相关文章

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

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

  2. BZOJ3053:The Closest M Points(K-D Teee)

    Description The course of Software Design and Development Practice is objectionable. ZLC is facing a ...

  3. 【BZOJ 3053】The Closest M Points

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

  4. BZOJ 3053 The Closest M Points

    [题目分析] 典型的KD-Tree例题,求k维空间中的最近点对,只需要在判断的过程中加上一个优先队列,就可以了. [代码] #include <cstdio> #include <c ...

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

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

  6. 【HDOJ】4347 The Closest M Points

    居然是KD解. /* 4347 */ #include <iostream> #include <sstream> #include <string> #inclu ...

  7. bzoj 3053 HDU 4347 : The Closest M Points kd树

    bzoj 3053 HDU 4347 : The Closest M Points  kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差 ...

  8. 数据结构(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 ...

  9. poj:4091:The Closest M Points

    poj:4091:The Closest M Points 题目 描写叙述 每到饭点,就又到了一日几度的小L纠结去哪吃饭的时候了.由于有太多太多好吃的地方能够去吃,而小L又比較懒不想走太远,所以小L会 ...

随机推荐

  1. Linux各发行版本 优缺点 简介

    2008.01.21 13:43 Linux最早由Linus Benedict Torvalds在1991年开始编写.在这之前,RichardStallman创建了Free SoftwareFound ...

  2. 题目1444:More is better

    时间限制:3 秒 内存限制:100 兆 特殊判题:否 提交:1362 解决:640 题目描述: Mr Wang wants some boys to help him with a project. ...

  3. WCF 傻瓜教程

    第一步,新建WCF服务应用程序 第二步,定义接口: 修改接口类,定义你要的方法接口默认文件名:IService1.cs 第三步,实现接口: 在svc文件里实现接口方法,默认文件名:Service1.s ...

  4. 【BZOJ1305】 [CQOI2009]dance跳舞

    Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...

  5. 微软职位内部推荐-This Job is no longer available.

    微软近期Open的职位: 如果你想试试这个职位,请跟我联系,我是微软的员工,可以做内部推荐.发你的中英文简历到我的邮箱:Nicholas.lu.mail(at)gmail.com

  6. 一个好用且方便的FastCgi C++库 - FastCgi++

    不知道你是不是曾经发愁过使用FastCgi库来使用C++开发Fastcgi程序繁琐而且会与C++ STL代码产生冲突的地方,或者你还是习惯了cout而不是pringf,那这篇文章就可以了解到一个使用的 ...

  7. java.lang.NoSuchMethodError: javaxservlet.http.HttpServletRequest.isAsyncStarted()Z

    鸣谢网址:http://stackoverflow.com/questions/25940571/java-lang-nosuchmethoderror-javaxservlet-http-https ...

  8. 免费素材:25套免费的 Web UI 设计的界面元素(转)

    Web 元素是任何网站相关项目都需要的,质量和良好设计的元素对于设计师来说就像宝贝一样.如果您正在为您的网站,博客,Web 应用程序或移动应用程序寻找完美设计的网页元素,那么下面这个列表会是你需要的. ...

  9. python检测文件是否更新

    import os import time filename = "test.txt" info = os.stat(filename) if time.time()-info.s ...

  10. ZOJ 1008 Gnome Tetravex(DFS)

    题目链接 题意 : 将n*n个正方形进行排列,需要判断相邻的正方形的相邻三角形上边的数字是不是都相等. 思路 : 只知道是个深搜,一开始不知道怎么搜,后来看了题解才明白,就是说不是自己去搜,而是将给定 ...