题目链接: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. STARTUP.A51详解及如何使能可重入函数

    $NOMOD51       ;Ax51宏汇编器控制命令:禁止预定义的8051;------------------------------------------------------------ ...

  2. bzoj4003

    http://www.lydsy.com/JudgeOnline/problem.php?id=4003 可合并堆. 每个点都有一个小根堆,记住可以到这个点的骑士有哪些,以战斗力为关键字. 从底层到顶 ...

  3. poj1011 Sticks(dfs+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 110416   Accepted: 25331 Descrip ...

  4. 源码分析之spring-JdbcTemplate日志打印sql语句

    对于开源的项目来说的好处就是我们遇到什么问题可以通过看源码来解决. 比如近期有个同事问我说,为啥JdbcTemplate中只有在Error的时候才打印出sql语句呢.我一想,这和log的配置有关系吧. ...

  5. [原创作品]html css改变浏览器选择文字的背景和颜色

    又很久没有'剥壳'了,最近在为一家公司做一个生产管理解决方案.所以都很忙.今天的话题很简单,就做一个很简单的网页特效.今天偶然浏览到一个网站,他们在选择文字时,样子不是蓝背景和白色字体那么单调,感觉这 ...

  6. 利用Excel批量高速发送电子邮件

    利用Excel批量高速发送电子邮件,分两步: 1. 准备待发送的数据: a.) 打开Excel,新建Book1.xlsx b.) 填入以下的内容, 第一列:接收人,第二列:邮件标题,第三列:正文,第四 ...

  7. [Javascript] Advanced Reduce: Composing Functions with Reduce

    Learn how to use array reduction to create functional pipelines by composing arrays of functions. co ...

  8. windows 删除多层文件夹

    眼下目录d:\clu_1下有99个目录,名字为0,1....99,每一个目录下又有25个目录,目录名为0,1,....24,其下其下又有以日期命名的目录(如20140521),最后是zip文件.如一个 ...

  9. iOS会议和组织

    全世界有许多iOS会议和组织,如果你没有机会去参加,知道他们的存在和向他们学习对你也是有益的.事实上,他们中有些提供免费的幻灯片.视频,有用资料等,所以你不能够忽视他们. 有一些会议的主题并不仅仅关于 ...

  10. Git远程使用技巧

    git作为强大的版本管理软件,已经得到了广泛的应用,很多人对于本地的git操作已经非常熟悉了.然而有的时候,我们也需要一个远程的,类似云的仓库来存储我们的一些代码.github给予了我们不限量的空间来 ...