题目链接: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)的更多相关文章

  1. 简单题(K-D Tree)

    简单题不简单-- 我们把单点加操作改成插入一个权值为增加量的点,将问题转化成询问一个矩阵中所有点的和,用 \(K-D\ Tree\) 维护,时间复杂度 \(O(n\sqrt{n})\) \(Code\ ...

  2. BZOJ 2648 SJY摆棋子(KD Tree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...

  3. 【BZOJ2843】极地旅行社(Link-Cut Tree)

    [BZOJ2843]极地旅行社(Link-Cut Tree) 题面 BZOJ 题解 \(LCT\)模板题呀 没什么好说的了.. #include<iostream> #include< ...

  4. 【BZOJ1969】航线规划(Link-Cut Tree)

    [BZOJ1969]航线规划(Link-Cut Tree) 题面 BZOJ 题解 删边操作 套路呀 离线读入倒过来做 变成加边操作 现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是 ...

  5. 【BZOJ3282】Tree (Link-Cut Tree)

    [BZOJ3282]Tree (Link-Cut Tree) 题面 BZOJ权限题呀,良心luogu上有 题解 Link-Cut Tree班子提 最近因为NOIP考炸了 学科也炸了 时间显然没有 以后 ...

  6. 【BZOJ3999】[TJOI2015]旅游(Link-Cut Tree)

    [BZOJ3999][TJOI2015]旅游(Link-Cut Tree) 题面 BZOJ 洛谷 题解 一道不难的\(LCT\)题(用树链剖分不是为难自己吗,这种有方向的东西用\(LCT\)不是方便那 ...

  7. 【BZOJ5212】[ZJOI2018]历史(Link-Cut Tree)

    [BZOJ5212][ZJOI2018]历史(Link-Cut Tree) 题面 洛谷 BZOJ 题解 显然实际上就是给定了一棵树和每个点被\(access\)的次数,求解轻重链切换的最大次数. 先考 ...

  8. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  9. 哈夫曼树(Huffman Tree)与哈夫曼编码

    哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman coding)

随机推荐

  1. 运用Swagger 添加WebAPI 文档

    1. Go to Web link https://www.nuget.org/packages/Swashbuckle/ and check which version do we want. 2. ...

  2. EXTJS4:在grid中加入合计行

    extjs4很方便的实现简单的合计(针对在不分页的情况下): 它效果实现在:Ext.grid.feature.Summary这个类中 Ext.define('TestResult', { extend ...

  3. 在 Ubuntu 12.04 上安装 GitLab6.0

    安装环境: 操作系统:    Ubuntu 12.4 LTS 英文 数据库:        mysql5.5.32 web服务器: nginx1.4.1 首先, 添加git和nginx的ppa,并升级 ...

  4. PHP中获取文件扩展名

    function get_extension($file) { return substr(strrchr($file, '.'), 1) ; } function get_extension($fi ...

  5. 多封装,少开放。强烈建议C++标准添加class之间的注入机制

    近日在改动了一下下引擎代码(为了自己的组件),发现有些接口是仅仅有特定类及其内部函数才去訪问,却不使用友元声明的形式进行数据訪问--当然使用了普通非virtual的形式也就是意味着不建议重载. 故此: ...

  6. HashSet的分析(转)

    一.  HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二.  ...

  7. 打开Eclipse出现 parsesdkcontent failed 的解决办法

    出现这个问题是由于系统曾安装过SDK和AVD,所以需要删除.android和相应的workspace文件夹,然后进入我的电脑->高级系统设置->环境变量,在系统变量里,更新ANDROID_ ...

  8. NSString属性什么时候用copy,什么时候用strong?【转】

    转自:http://www.cocoachina.com/ios/20150512/11805.html. 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境): ...

  9. (转)用来理解Java的8个图表

    很多时候,一张图比你说 1000 个字能更有效的说清楚一个问题.我们列举了 8 个关于 Java 语言的图表,或许可以让你对 Java 有着更深入的认识. 1.字符串不变性(String Immuta ...

  10. K3整理

    当金蝶提示“该模块使用已超过正式版许可最大数!”,需要解决的办法是: 打开K3的“帐套管理”系统,“系统(S)”菜单-“系统使用状况(D)”-系统使用状态窗口,然后点击橡皮擦 删除即可了.