BZOJ 2626 JZPFAR(KD-tree)
题目链接: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>
#include<cstring>
#include<iostream>
#define ll long long
struct Point{
ll d[],max[],min[];
int l,r,id;
}a[];
int root,n,K,cmpd,id[],m;
ll X,Y,ans[];
bool cmp(Point p1,Point p2){
if (p1.d[cmpd]!=p2.d[cmpd]) return p1.d[cmpd]<p2.d[cmpd];
else return p1.d[!cmpd]<p2.d[!cmpd];
}
void updata(int x){
if (a[x].l){
int j=a[x].l;
for (int i=;i<;i++)
a[x].max[i]=std::max(a[x].max[i],a[j].max[i]),
a[x].min[i]=std::min(a[x].min[i],a[j].min[i]);
}
if (a[x].r){
int j=a[x].r;
for (int i=;i<;i++)
a[x].max[i]=std::max(a[x].max[i],a[j].max[i]),
a[x].min[i]=std::min(a[x].min[i],a[j].min[i]);
}
}
ll sqr(ll x){
return x*x;
}
ll dist(int p,ll x,ll y){
ll dis=,d1,d2;
d1=std::abs(x-a[p].max[]);
d2=std::abs(x-a[p].min[]);
if (d1>d2) dis+=d1*d1;
else dis+=d2*d2;
d1=std::abs(y-a[p].max[]);
d2=std::abs(y-a[p].min[]);
if (d1>d2) dis+=d1*d1;
else dis+=d2*d2;
return dis;
}
void query(int p){
if (!p) return;
ll dl,dr,d0;
int t=K;
d0=sqr(std::abs(a[p].d[]-X))+sqr(std::abs(a[p].d[]-Y));
while (t&&(d0>ans[t]||(d0==ans[t]&&a[p].id<id[t]))) t--;
if (t!=K){
t++;
for (int i=K;i>=t+;i--){
ans[i]=ans[i-];
id[i]=id[i-];
}
ans[t]=d0;id[t]=a[p].id;
}
if (a[p].l) dl=dist(a[p].l,X,Y);else dl=;
if (a[p].r) dr=dist(a[p].r,X,Y);else dr=;
if (dl>dr){
if (dl>=ans[K]) query(a[p].l);
if (dr>=ans[K]) query(a[p].r);
}else{
if (dr>=ans[K]) query(a[p].r);
if (dl>=ans[K]) query(a[p].l);
}
}
int build(int l,int r,int d){
int mid=(l+r)/;
cmpd=d;
std::nth_element(a+l,a+mid,a++r,cmp);
a[mid].max[]=a[mid].min[]=a[mid].d[];
a[mid].max[]=a[mid].min[]=a[mid].d[];
if (l!=mid) a[mid].l=build(l,mid-,!d);
if (r!=mid) a[mid].r=build(mid+,r,!d);
updata(mid);
return mid;
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%lld%lld",&a[i].d[],&a[i].d[]);
a[i].id=i;
}
root=build(,n,);
scanf("%d",&m);
while (m--){
scanf("%lld%lld%d",&X,&Y,&K);
for (int i=;i<=;i++) id[i]=,ans[i]=;
query(root);
printf("%d\n",id[K]);
}
}
BZOJ 2626 JZPFAR(KD-tree)的更多相关文章
- 简单题(K-D Tree)
简单题不简单-- 我们把单点加操作改成插入一个权值为增加量的点,将问题转化成询问一个矩阵中所有点的和,用 \(K-D\ Tree\) 维护,时间复杂度 \(O(n\sqrt{n})\) \(Code\ ...
- BZOJ 2648 SJY摆棋子(KD Tree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...
- 【BZOJ2843】极地旅行社(Link-Cut Tree)
[BZOJ2843]极地旅行社(Link-Cut Tree) 题面 BZOJ 题解 \(LCT\)模板题呀 没什么好说的了.. #include<iostream> #include< ...
- 【BZOJ1969】航线规划(Link-Cut Tree)
[BZOJ1969]航线规划(Link-Cut Tree) 题面 BZOJ 题解 删边操作 套路呀 离线读入倒过来做 变成加边操作 现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是 ...
- 【BZOJ3282】Tree (Link-Cut Tree)
[BZOJ3282]Tree (Link-Cut Tree) 题面 BZOJ权限题呀,良心luogu上有 题解 Link-Cut Tree班子提 最近因为NOIP考炸了 学科也炸了 时间显然没有 以后 ...
- 【BZOJ3999】[TJOI2015]旅游(Link-Cut Tree)
[BZOJ3999][TJOI2015]旅游(Link-Cut Tree) 题面 BZOJ 洛谷 题解 一道不难的\(LCT\)题(用树链剖分不是为难自己吗,这种有方向的东西用\(LCT\)不是方便那 ...
- 【BZOJ5212】[ZJOI2018]历史(Link-Cut Tree)
[BZOJ5212][ZJOI2018]历史(Link-Cut Tree) 题面 洛谷 BZOJ 题解 显然实际上就是给定了一棵树和每个点被\(access\)的次数,求解轻重链切换的最大次数. 先考 ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- 哈夫曼树(Huffman Tree)与哈夫曼编码
哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman coding)
随机推荐
- jquery获得select选中索引
select选中索引有好多方式, 这两种方式取不到索引值这两种方式取不到索引值这两种方式取不到索引值这两种方式取不到索引值 $('#someId').find('option:select ...
- VS环境下的makefile编译
直接找这个了,原来VS也可以makefile,在windows上解析makefile的软件叫NMAKE.exe 打算用命令Cmake -G“NMake Makefiles” 生成VS环境下Nmake的 ...
- AS3排序
package { import flash.display.Sprite; public class Sort extends Sprite { private var arr:Vector.< ...
- win10 iis 创建新站点注意事项
新建站点时:注意文件夹权限增加everyone. 快速打开IIS:win+r:inetmgr
- c指针点滴4-指针的值
#include <stdio.h> #include <stdlib.h> void main() { ; int *p = # //double *p1 = ...
- 代理delegate、NSNotification、KVO在开发中的抉择
在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation: 2.通 ...
- Android静态变量使用陷阱
静态变量大家再熟悉不过了,本来没什么好重复的.事情起因是这样的,最近测试那边反应正在做的一个产品总是莫名其妙的显示不出某些数据,甚至闪退崩溃,仔细查了几遍发现没什么问题,最后百般周折发现在那部测试机上 ...
- HADOOP集群监控工具AMBARI
HADOOP集群监控工具AMBARI安装 Apache Ambari是对Hadoop进行监控.管理和生命周期管理的开源项目.它也是一个为Hortonworks数据平台选择管理组建的项目.Ambari向 ...
- java基础之String
字符串的含义 字符串的应用 字符串的方法
- (转载)Linux网络配置和setup工具包安装
查看网卡是否正常安装 命令:lspci |grep Ether 1.修改网卡配置 命令: vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth ...