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)
随机推荐
- Altium designer快捷键
1. 先设置参数,开启高亮显示,见下图红圈处: (1)选择使能可以高亮:CTRL+鼠标左键点击相应PCB网络即可高亮 (2)选择仅切换键时高亮显示,可以在CTRL+鼠标左键点击相应PCB网络高亮后,移 ...
- BAT线下战争:巨额投资或培养出自己最大对手(包括美团、58、饿了么在内的公司都在计划推出自己的支付工具和金融产品,腾讯只做2不做O)
BAT线下战争:巨额投资或培养出自己最大对手 2015年10月12日09:49 <财经>杂志 我有话说(18人参与) 收藏本文 BAT大举投资线下公司,看似咄咄逼人 ...
- 如何将android studio项目转换成eclipse
更新:虽然本人坚守eclipse很久,但是现在我也不再推荐继续用eclispe了,自己的项目用还没什么问题,但是你如果想用github上的项目,用eclispe会越来越难.如果你仍然感兴趣,继续看下面 ...
- Ext中图片上传预览的问题,困扰了好几天终于解决了,记录下
{ columnWidth:.50, xtype:'textfield', style:"padding-top:5px", name:'goodsMainPhoto', id:' ...
- javaDay1 基础知识
常用dos命令 •d: 回车 盘符切换 •dir(directory):列出当前目录下的文件以及文件夹 •md (make directory) : 创建目录 •rd (remove directo ...
- awk实践积累
#cat iii |awk '{max=$2;min=$2;for (i=2;i<=NF;i++) if ($i>max) max=$i fi} {for (i=2;i<=NF;i+ ...
- 删除ubuntu旧内核
ubuntu的内核经常升级,而老内核并不自动卸载.时间长了,就有一大堆内核垃圾,需要我们手动去清理. 先用uname -a 查看当前内核版本: xzc@xzc-HP-ProBook-4446s:~$ ...
- (转)iOS Wow体验 - 第三章 - 用户体验的差异化策略
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第三章译文精选,其余章节将陆续放出.上一篇:Wow ...
- javascript实现的手风琴折叠菜单效果
演示地址:http://codepen.io/anon/pen/pJERMq 实现效果: HTML代码: <!DOCTYPE html> <html lang="en&qu ...
- hdu4055 dp
http://acm.hdu.edu.cn/showproblem.php?pid=4055 Problem Description The signature of a permutation is ...