K-DTree学习
应用于K维数据的快速查找,比如横坐标,纵坐标,价格……,本模板以16青岛区域赛K题为例 —— 三维K - D Tree 模板
我们应该都见过平衡树吧,那就是1-D树,变成k维之后,我们连续分割1 - k维,然后继续分割,实现快速查找,画图的时候就能够理解这个数据结构了
n个旅馆 x,y,csot
m个用户 x,y,limitcost
问你每个用户在可以接受的价格内距离最近的旅馆是哪个 #define deep 3 // K-D树的维度
#define inf (1e18) //用ll防止开根号,造成浮点误差
using namespace std;
typedef long long ll;
const int maxn = 2e5+2e3;
int retid;//最优的旅馆选择编号
ll ans;//判断距离最小值
int loc;//当前进行的维度
int n,m;//n个旅馆,m个顾客
struct node{
int id;
int data[deep];
//对各个维度都从小到大排序
bool operator < (const node &b) const{
if(data[loc] < b.data[loc])
return 1;
return 0;
}
}P[maxn],tmp[maxn],Now,Aim;//P数组排序,tmp数组副本作为输出
void creat_KDtree(int l,int r,int flor){
if(l >= r){
return;
}
int mid = (l + r) >> 1;
loc = flor % deep;
nth_element(P+l,P+mid,P+r+1);
/*把p+mid元素放在中间位置,使其左边元素比它小,右边比它大
nth_element(first,nth,last)
first,last 第一个和最后一个迭代器,也可以直接用数组的位置。
nth,要定位的第n个元素,能对它进行随机访问.
将第n_th元素放到它该放的位置上,左边元素都小于它,右边元素都大于它.*/
creat_KDtree(l,mid-1,flor+1);
creat_KDtree(mid+1,r,flor+1);
}
void judge(int x)//根据题意的判断函数{
Now = P[x];
if(Now.data[2] > Aim.data[2])
return;
ll dis = (Now.data[0] - Aim.data[0]) * (Now.data[0] - Aim.data[0]) + (Now.data[1] - Aim.data[1]) * (Now.data[1] - Aim.data[1]);
if(dis < ans || dis == ans && Now.id < retid){
ans = dis;
retid = Now.id;
}
}
void Find(int l,int r,int flor)//也是根据题意来写{
loc = flor % deep;
if(l >= r){
if(l == r)
judge(l);
return;
}
int mid = (l + r) >> 1;
judge(mid);
Now = P[mid];
if(loc == 2){
if(Now.data[loc] >= Aim.data[loc])
Find(l,mid-1,flor+1);
else{
Find(l,mid-1,flor+1);
Find(mid+1,r,flor+1);
}
}
else{
int len = Now.data[loc] - Aim.data[loc];
if(len >= 0){
Find(l,mid-1,flor+1);
if(((ll)len * len) < ans){
Find(mid+1,r,flor+1);
}
}
else{
Find(mid+1,r,flor+1);
if(((ll)len * len) < ans){
Find(l,mid-1,flor+1);
}
}
}
}
K-DTree学习的更多相关文章
- 编程语言教程书该怎么写: 向K&R学习!
原文地址:Lax Language TutorialsAndrew Binstock 每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁.从这些年的评审经验来看,这些语 ...
- 2. K线学习知识二
1. K线 - 阳线 定义:阳线是证券市场上指收盘价高于开盘价的K线,K线图中用红线标注表示涨势. A:小阳星 全日中股价波动很小,开盘价与收盘价极其接近,收盘价略高于开盘价. 小阳星的出现,表明行情 ...
- A* k短路 学习笔记
题目大意 n个点,m条边有向图,给定S,T,求不严格k短路 n<=1000 m<=100000 k<=1000 不用LL 分析 A*算法 f(i)表示从S出发经过i到T的估价函数 \ ...
- K短路 学习笔记
K短路,顾名思义,是让你求从$s$到$t$的第$k$短的路. 暴力当然不可取,那么我们有什么算法可以解决这个问题? -------------------------- 首先,我们要维护一个堆. st ...
- 初涉深度优先搜索--Java学习笔记(二)
版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这 ...
- BZOJ3442: 学习小组
Description [背景] 坑校准备鼓励学生参加学习小组. [描述] 共有n个学生,m个学习小组,每个学生有一定的喜好,只愿意参加其中的一些学习小组,但是校领导为学生考虑,规定一个学生最 ...
- 【BZOJ】【3442】学习小组
网络流/费用流 orz zyf 裸的费用流,根据题目描述即可建出如下的图: S->i 费用表示每有一个加入第 i 个小组的学生,需要花的钱,由于是跟流量(人数)的二次方相关,所以要拆边……然后每 ...
- 20165308 预备作业3 Linux安装及学习
Linux安装及学习 Linux的安装 因为做的比较晚, 安装过程按照老师给出的步骤和同学指导并未出现很多问题,只是安装VirtualBox虚拟机增强功能时,代码没输正确,结果一直无法正确安装,后来也 ...
- 深度学习在CTR预估中的应用
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 一.前言 二.深度学习模型 1. Factorization-machine(FM) FM = LR+ e ...
- 【刷题】洛谷 P4209 学习小组
题目描述 共有n个学生,m个学习小组,每个学生只愿意参加其中的一些学习小组,且一个学生最多参加k个学习小组.每个学生参加学习小组财务处都收一定的手续费,不同的学习小组有不同的手续费.若有a个学生参加第 ...
随机推荐
- forEach() 和 map() 遍历
1.forEach() 没有返回值. arr[].forEach(function(value,index,array){ //do something }) 参数:value数组中的当前项, i ...
- uni-app
1 路由的跳转 uni.navigateTo({ url:'/pages/home/search' }); //非tabBar页面跳转 uni.switchTab({ url:"/pages ...
- pandas用法之二
1,函数应用 ①map() 将函数作用于一个Series的每一个函数(不能是DataFrame) 类似于Python的高阶函数map() 函数可以是Numpy中的通用函数,也可以是自定义函数 优点:代 ...
- shell中脚本调试----学习
1.使用dos2unix命令处理在windows下开发的脚本 将windows下编辑的脚本放置到linux下执行的情况如下: [root@ks ~]# cat -v nginx.sh #!/bin/b ...
- scrapy 爬取小说
QiushuSpider # -*- coding: utf-8 -*- import scrapy import time from qiushu.items import QiushuItem c ...
- Image 图片
随机矩阵画图 这一节我们讲解怎样在matplotlib中打印出图像.这里打印出的是纯粹的数字,而非自然图像.下面用 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel. impo ...
- 面试简单整理之mybatis
125.mybatis 中 #{}和 ${}的区别是什么? 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解 ...
- 【转】一个 Linux 上分析死锁的简单方法
简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...
- web安全之机器学习入门——2.机器学习概述
目录 0 前置知识 什么是机器学习 机器学习的算法 机器学习首先要解决的两个问题 一些基本概念 数据集介绍 1 正文 数据提取 数字型 文本型 数据读取 0 前置知识 什么是机器学习 通过简单示例来理 ...
- js最实用string(字符串)类型的使用及截取与拼接详解
var a = '世界上最远的距离不是天涯海角'; 一.通过字符获取位置或通过位置获取字符: //指定位置返回字符console.log(str.charAt(1));console.log(str[ ...