kdtree HDU5992】的更多相关文章

STL里面的nth_element()函数 用法:nth_element(first,nth,last) int a[maxn]; nth_element(a,a+k,a+f); 作用:在a到a+f区间内,使第k位左边的都比它小,右边的都比它大. kdtree代码: #include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define fio ios::sync_with_stdio(…
题目链接: Finding Hotels Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 102400/102400 K (Java/Others) Problem Description There are N hotels all over the world. Each hotel has a location and a price. M guests want to find a hotel with an accept…
比较裸的kd-tree,但是比较考验剪枝. 貌似除了经典的矩形距离剪枝之外, 还必须加个剪枝是某个矩形内的最小价格如果大于价格限制的话,则剪枝. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 200010 #define EPS 0.00000001 #define INF 1000000000000000007.0 #define KD 2 str…
题面 题意:二维平面上有很多点,每个点有个权值,现在给你一个点(很多组),权值v,让你找到权值小于等于v的点中离这个点最近的,相同的输出id小的 题解:很裸的KDtree,但是查询的时候有2个小限制, 1个是要小于等于v,1个是输出最小id 第一个,对每个点判断dis的时候 如果价钱高于v 距离就变为INF 低于v就没有影响 第二个,如果disl或者disr 和当前最近的dis 相等 就继续询问以得到更小的id #include<bits/stdc++.h> typedef long long…
看了青岛赛区的题简单学了一下kd,感觉这东西还是挺厉害的 一般kd树找最近点对最坏是O(n),但是随机情况下跑得还是很快的 kd树是一棵BST,但是每一层的关键字不同 一般写法是按照每一维轮流来,这一维小的放左子树,大的放右边的 每个节点再维护这节点所管辖的节点每一维的范围,这样基本就能做题了 kdtree一般是静态直接建好的,插入可以套一个替罪羊树重构做到logn,但是据说慢 那么怎么查询最近点呢 每到一个节点,比较通过这节点所管辖点的每一维的范围,估计出可能最小的距离 优先访问估值优的子树…
稍微看了一下KD-tree的讲义,大概明白了它的原理,但是实现不出来... 所以无耻的抄了一下黄学长的... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define inf 1000000000 using namespace std; inline int read() { ,f=;char ch=getch…
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 830  Solved: 455[Submit][Status][Discuss] Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. 但是,他们觉得,玩普通的捉迷藏没什么意思,还是…
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 490  Solved: 237[Submit][Status][Discuss] Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标.1 < =  N < =  100000, 1 < =  K <…
[题目分析] KD-Tree第一题,其实大概就是搜索剪枝的思想,在随机数据下可以表现的非常好NlogN,但是特殊数据下会达到N^2. 精髓就在于估价函数get以及按照不同维度顺序划分的思想. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <st…
[题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <string> #include <algorithm> #include <vector> #includ…
题意: 二维平面n个点 每次给出一个点询问距离第k小的点. SOL: kdtree裸题,抄了一发别人的模板...二维割起来还是非常显然的.膜rzz的论文. 不多说了吧.... Code: /*========================================================================== # Last modified: 2016-03-18 20:26 # Filename: 2626.cpp # Description: =========…
区间修改的kd-tree,打标记,下传. 每次询问的时候,从询问点向上找到根,然后依次下传下来,再回答询问. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 100001 #define KD 2 int n,root,m,q,qp[2][KD],fa[N],val,delta[N]; bool dn; struct Node { int ch[2…
2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子.此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) .现在给出N<=500000个初始棋子.和M<=500000个操作.对于每个白色棋子,输出…
参考资料: Kd Tree算法原理 Kd-Tree,即K-dimensional tree,是一棵二叉树,树中存储的是一些K维数据.在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成的K维空间的一个划分,即树中的每个结点就对应了一个K维的超矩形区域(Hyperrectangle).…
http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!!! 本题裸的kdtree,比上一题还要简单...................................... 对于当前点,判断进入左或右子树,然后看答案是否能过分割线..如果能,进入右或左子树.........并且如果答案个数小于k,也要进入.. 然后就浪吧........... #inc…
http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id=2648 双倍经验题... kdtree裸题吧.....今天学了下kdtree...感觉挺简单的.... 其实就是对几何图形进行剖分建树,而特殊在于,x和y轴轮流剖....这样可以提供很好的性质以便于查找... (一开始脑补了个treap代替kdtree.....显然我脑残了....写到一半发现这…
学习链接:http://www.cnblogs.com/eyeszjwang/articles/2429382.html 下面实现的kdtree支持以下操作:(1) 插入一个节点(2) 插入n个节点(3) 查找距离某个给定点距离最小的K个节点. 插入的时候可能会导致树严重不平衡,这个时候会重建某个子树. #include <algorithm> #include <queue> /*** _NodeType: 节点类型 _CompareFuncType: 比较函数类型,它应该接受两…
就是K维空间上的二叉查找树. 每个node对应k维空间的超矩形区域 在方差最大的维度上,比较数据与kd-tree的根节点.中间节点,在该维度上的中值处划分,得到新的子空间,直到不能再分. 用于最近邻查找时候,需要对未被访问过的分支进行回溯,如果距离更小,就更新.…
库在这里 这个很好用. 例子: /*! gcc -Wall -g -o test test.c libkdtree.a */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <assert.h> #include <time.h> #include "kdtree.h" int main(int argc, char **argv) { ;…
感谢orz神·小黑的指导 kd-tree就是用来计算若干维空间k近/远点的数(shou)据(suo)结(you)构(hua) 建树 假设题目是k维的点 第deep层就是用deep%k+1维把所有点分为两块 取deep%k+1维中位数的点做为当前子树的根节点 再把该维比这个点小的点扔到左子树 比这个点大的扔到右子树 递归处理 详见代码 ,cmp); } ll build(ll l,ll r,ll deep){ if (l==r){ kd[l].lc=kd[r].rc=; return l; } S…
4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 234  Solved: 82[Submit][Status][Discuss] Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 将格子x,y里的数字加上A 2 x1 y1 x2 y2 1<=x1<= x2<=N 1<=y1…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2626 题意:平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离(px, py)相同,那么认为标号较小的点距离较大. 思路:对n个点做KDtree. #include<algorithm> #include<cstdio> #include<cmath> #…
本文内容基于An introductory tutoril on kd-trees 1.KDTree介绍 KDTree根据m维空间中的数据集D构建的二叉树,能加快常用于最近邻查找(在加快k-means算法中有应用). 其节点具有如下属性(对应第5节中的程序实现): 非叶子节点(不存储数据): partitionDimention 用于分割的维度,取值范围为1,2,…,m partitionValue 用于分割的值v,当数据点在维度partitionDimention上的值小于v时,被分到左节点,…
0.目录 前置知识 思路介绍 详述 1 确定h的中心点 2 算法步骤 java实现 1.前置知识 本文内容基于<Accelerating exact k-means algorithms with geometric reasoning> KDTree k-means 2.思路介绍 k-means算法在初始化中心点后C通过以下迭代步骤得到局部最优解:   a.将数据集D中的点x赋给距离最近的中心点   b.在每个聚类中,重新计算中心点 传统算法中,a步需要计算n*k个距离(n为D的大小,k为聚…
[KD-TREE简介]于SYC1999大神"迷住"下一个.我开始接触这样的算法. 首先.这个概念大概能去百度百科.详细的实施.我在看RZZ的代码长大的. 我们能够想象在平面上有N个点. 首先,按横坐标排序找到最中间的那个点. 然后水平划一条线,把平面分成左右两个部分.再递归调用左右两块. 注意.在第二次(偶数次)调用的时候,是找到纵坐标中最中间的点,并垂直画一条线. 这样效率看上去非常好.维护的时候有点像线段树. 每一个点记录它的坐标.它辖管的区间4个方向的极值.它的左右(或上下)的两…
本文介绍一种用于高维空间中的高速近期邻和近似近期邻查找技术--Kd-Tree(Kd树). Kd-Tree,即K-dimensional tree,是一种高维索引树形数据结构,经常使用于在大规模的高维数据空间进行近期邻查找(Nearest Neighbor)和近似近期邻查找(Approximate Nearest Neighbor),比如图像检索和识别中的高维图像特征向量的K近邻查找与匹配.本文首先介绍Kd-Tree的基本原理,然后对基于BBF的近似查找方法进行介绍.最后给出一些參考文献和开源实现…
吐槽 kd-tree这个东西很早就听说过了但是qwq一直没有去了解 (原因的话..啊哈哈听说是什么跟二维平面之类的东西有关的所以就怂掉了qwq没错就是怂qwq) 但其实好像..真的很暴力啊qwq知道思路之后随便乱搞系列qwq 时间复杂度什么的应该是玄学恩qwq(网上看到有dalao说期望复杂度是O(n^(d-1)/d),不会证就是这样qwq) 正题 首先kd-tree是一棵类似二叉查找树的东西 拿二维的kd-tree为例,每个数据有两个关键值\(x\)和\(y\) 那么kd-tree的总的思路就…
http://blog.csdn.net/pipisorry/article/details/52186307 )选择特征(坐标轴)的方法  (2)以该特征的哪一个为界 (3)达到什么条件算法结束. (1)选择特征的方法 计算当前观测点集合中每个特征的方差,选择方差最大的一个特征,然后画一个垂直于这个特征的超平面将所有观测点分为两个集合. (2)以该特征的哪一个值为界 即垂直选择坐标轴的超平面的具体位置. 第一种是以各个点的方差的中值(median)为界.这样会使建好的树非常地平衡,会均匀地分开…
这里将写了一个KDTree类,仅实现了最近邻,K近邻之后若有时间再更新: from collections import namedtuple from operator import itemgetter from pprint import pformat import numpy as np class Node(namedtuple('Node', 'location left_child right_child')): def __repr__(self): return pforma…
在竞赛中,kd-tree一般只用于平面,很少有高于二维的情况. 在随机情况下,kd-tree的复杂度为O(NlogN),但会被极端数据卡到平方级别. 总而言之,就是优美的暴力. 查询时,通过估价函数进行减值.当然,这个函数一定要大于等于最后的结果,才有正确性. 1.求平面最近点对,欧几里得距离.精确到小数点后4位. 模板,不解释. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include<bits/stdc++.h> using…