hdu4347The Closest M Points kdtree
kdtree讲解:
https://blog.csdn.net/qing101hua/article/details/53228668
https://blog.csdn.net/acdreamers/article/details/44664645
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4347
给你一堆点,每次查询给一个点求和这个点最近的m个点是什么(距离是欧氏距离)
裸的kdtree
- //#pragma comment(linker, "/stack:200000000")
- //#pragma GCC optimize("Ofast,no-stack-protector")
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- //#pragma GCC optimize("unroll-loops")
- #include<bits/stdc++.h>
- #define fi first
- #define se second
- #define mp make_pair
- #define pb push_back
- #define pi acos(-1.0)
- #define ll long long
- #define vi vector<int>
- #define mod 1000000007
- #define C 0.5772156649
- #define ls l,m,rt<<1
- #define rs m+1,r,rt<<1|1
- #define pil pair<int,ll>
- #define pli pair<ll,int>
- #define pii pair<int,int>
- #define cd complex<double>
- #define ull unsigned long long
- #define base 1000000000000000000
- #define fio ios::sync_with_stdio(false);cin.tie(0)
- using namespace std;
- const double g=10.0,eps=1e-;
- const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
- int n,k,idx;
- struct node{
- int f[];
- bool operator <(const node&rhs)const{
- return f[idx]<rhs.f[idx];
- }
- }a[N];
- priority_queue<pair<double,node> >q;
- struct kdtree{
- bool vis[N<<];
- node date[N<<];
- void build(int l,int r,int rt,int dep)
- {
- if(l>r)return ;
- vis[rt]=;
- vis[rt<<]=vis[rt<<|]=;
- idx=dep%k;
- int m=(l+r)>>;
- nth_element(a+l,a+m,a+r+);
- date[rt]=a[m];
- build(l,m-,rt<<,dep+);
- build(m+,r,rt<<|,dep+);
- }
- void query(node p,int m,int rt,int dep)
- {
- if(!vis[rt])return ;
- printf("%d \n",rt);
- pair<double,node>cur(,date[rt]);
- for(int i=;i<k;i++)
- cur.fi+=(cur.se.f[i]-p.f[i])*(cur.se.f[i]-p.f[i]);
- int dim=dep%k;
- bool fg=;
- int x=rt<<,y=rt<<|;
- if(p.f[dim]>=date[rt].f[dim])swap(x,y);
- if(vis[x])query(p,m,x,dep+);
- if(q.size()<m)q.push(cur),fg=;
- else
- {
- if(cur.fi<q.top().fi)
- {
- q.pop();q.push(cur);
- }
- if((p.f[dim]-date[rt].f[dim])*(p.f[dim]-date[rt].f[dim])<q.top().fi)fg=;
- }
- if(vis[y]&&fg)query(p,m,y,dep+);
- }
- }kd;
- int main()
- {
- while(scanf("%d%d",&n,&k)!=EOF)
- {
- for(int i=;i<n;i++)
- for(int j=;j<k;j++)
- scanf("%d",&a[i].f[j]);
- kd.build(,n-,,);
- int t;scanf("%d",&t);
- while(t--)
- {
- node p;
- for(int i=;i<k;i++)scanf("%d",&p.f[i]);
- int m;scanf("%d",&m);
- while(!q.empty())q.pop();
- // printf("%d\n",idx);
- kd.query(p,m,,);
- printf("the closest %d points are:\n",m);
- node ans[];
- for(int i=;!q.empty();i++)ans[i]=q.top().se,q.pop();
- for(int i=m-;i>=;i--)
- for(int j=;j<k;j++)
- printf("%d%c",ans[i].f[j],j==k-?'\n':' ');
- }
- }
- return ;
- }
- /***********************
- ***********************/
hdu4347The Closest M Points kdtree的更多相关文章
- HDU 4347 - The Closest M Points - [KDTree模板题]
本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...
- hud 4347 The Closest M Points(KD-Tree)
传送门 解题思路 \(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割.它的插入删除复杂度为\(log^2 n\),它查 ...
- 【BZOJ】3053: The Closest M Points(kdtree)
http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!! ...
- [hdu4347]The Closest M Points(线段树形式kd-tree)
解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...
- HDU 4347 The Closest M Points (kdTree)
赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...
- bzoj 3053: The Closest M Points【KD-tree】
多维KDtree板子 左右儿子的估价用mn~mx当区间,假设区间里的数都存在:k维轮着做割点 #include<iostream> #include<cstdio> #incl ...
- 【kd-tree】bzoj3053 The Closest M Points
同p2626.由于K比较小,所以不必用堆. #include<cstdio> #include<cstring> #include<cmath> #include& ...
- [hdu4347]The Closest M Points(平衡树式kdtree)
解题关键:模板题(结合起来了) #include<iostream> #include<cstdio> #include<cstring> #include< ...
- 【BZOJ 3053】The Closest M Points
KDTree模板,在m维空间中找最近的k个点,用的是欧几里德距离. 理解了好久,昨晚始终不明白那些“估价函数”,后来才知道分情况讨论,≤k还是=k,在当前这一维度距离过线还是不过线,过线则要继续搜索另 ...
随机推荐
- 小程序页面链接-navigator(导航)
navigator-页面链接-通过设置open-type的值来确定页面的打开方式. <view class="btn-area"> <navigator url= ...
- 在MFC下面实际演示CCriticalSection 的使用
Q:CCriticalSection是什么? A:CCriticalSection是一种线程同步策略 或者说技术 或者方法 总之呢就是这么个意思.... 参考资料: http://blog.csdn ...
- delphi webbrowser 跨域访问
procedure IterateFrames(const AWB: IWebBrowser2);var Doc: IHTMLDocument2; Container: IOleContainer; ...
- WEB前端研发工程师编程能力成长之路(2)
四.[入微] 最强解决方案.你能够走在需求的前面,将当前需求里有的.没有直接提出来的.现在暂时没有但将来可能有的等等,及前端编程潜规则等各个方方面面都综合考虑,给出最优方案.以一招胜万招. var s ...
- [笔记] Ubuntu 18.04源码编译安装OpenCV 4.0流程
标准常规安装方法安装的OpenCV版本比较低,想尝鲜使用4.0版本,只好源码安装. 安装环境 OS:Ubuntu 18.04 64 bit 显卡:NVidia GTX 1080 CUDA:10.0 c ...
- AtCoder Regular Contest 080 D - Grid Coloring
地址:http://arc080.contest.atcoder.jp/tasks/arc080_b 题目: D - Grid Coloring Time limit : 2sec / Memory ...
- [转]loadrunner:系统的平均并发用户数和并发数峰值如何估算
一.经典公式1: 一般来说,利用以下经验公式进行估算系统的平均并发用户数和峰值数据 1)平均并发用户数为 C = nL/T 2)并发用户数峰值 C‘ = C + 3*根号C C是平均并发用户数,n是l ...
- 本地多张图片采用jmeter上传到ftp服务器的方法和获取服务器日志中某些关键字的基本方法
测试需求: 本地图片上传到ftp服务器里和另外两台不同算法比对服务器进行比对,得出漏检和误检结果:这实际属于功能测试范畴. 测试思路: 第一种方法:使用实际场景的摄像机抓拍图片上传到服务器,用录屏软件 ...
- GRUB2 分析 (三)
接上一篇 从地址0x8200开始的是lzma_decompress.img.这是由startup_raw.S编译生成的.这个文件稍微复杂点.首先一开始就是个跳转指令: ljmp $0, $ABS(LO ...
- 20145216史婧瑶《Java程序设计》第四次实验报告
实验四 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输出学号 实验步骤 1.搭建Android环境 2.安装Android,核心是配置JDK.SDK 3. ...