【BZOJ2626】JZPFAR kd-tree+堆
【BZOJ2626】JZPFAR
Description
Input
下面n行,每行两个整数x_i, y_i,表示n个点的坐标。点的标号按照输入顺序,分别为1..n。
下面一行,一个整数m,表示询问个数。
下面m行,每行三个整数px_i, py_i, k_i,表示一个询问。
Output
Sample Input
0 0
0 1
0 2
3
1 1 2
0 0 3
0 1 1
Sample Output
1
1
数据规模和约定
50%的数据中,n个点的坐标在某范围内随机分布。
100%的数据中,n<=10^5, m<=10^4, 1<=k<=20,所有点(包括询问的点)的坐标满足绝对值<=10^9,n个点中任意两点坐标不同,m个询问的点的坐标在某范围内随机分布。
题解:kd-tree+一个最小堆。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <utility>
#define x2(_) ((_)*(_))
#define rep for(int i=0;i<=1;i++)
#define MP(A,B) make_pair(A,B)
using namespace std;
typedef long long ll;
typedef pair<ll,int> pli;
const int maxn=100010;
struct kd
{
ll v[2],sm[2],sn[2];
int ls,rs,org,om;
kd () {}
kd (ll a,ll b,int c) {v[0]=sm[0]=sn[0]=a,v[1]=sm[1]=sn[1]=b,ls=rs=0,org=om=c;}
ll& operator [] (int a) {return v[a];}
}t[maxn];
int n,m,D,A,B,root;
priority_queue<pli> pq;
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmp(kd a,kd b)
{
return (a[D]==b[D])?(a[D^1]<b[D^1]):(a[D]<b[D]);
}
void pushup(int x,int y)
{
rep t[x].sm[i]=max(t[x].sm[i],t[y].sm[i]),t[x].sn[i]=min(t[x].sn[i],t[y].sn[i]);
t[x].om=min(t[x].om,t[y].om);
}
int build(int l,int r,int d)
{
if(l>r) return 0;
int mid=l+r>>1;
D=d,nth_element(t+l,t+mid,t+r+1,cmp);
t[mid].ls=build(l,mid-1,d^1),t[mid].rs=build(mid+1,r,d^1);
if(t[mid].ls) pushup(mid,t[mid].ls);
if(t[mid].rs) pushup(mid,t[mid].rs);
return mid;
}
pli getdis(int x)
{
return MP(-max(x2(t[x].sm[0]-A),x2(t[x].sn[0]-A))-max(x2(t[x].sm[1]-B),x2(t[x].sn[1]-B)),t[x].om);
}
void query(int x)
{
if(!x||getdis(x)>pq.top()) return ;
pli tmp=MP(-x2(t[x][0]-A)-x2(t[x][1]-B),t[x].org);
if(tmp<pq.top())
pq.push(tmp),pq.pop();
if(getdis(t[x].ls)<getdis(t[x].rs)) query(t[x].ls),query(t[x].rs);
else query(t[x].rs),query(t[x].ls);
}
int main()
{
n=rd();
int i,j,a,b,c;
for(i=1;i<=n;i++) a=rd(),b=rd(),t[i]=kd(a,b,i);
root=build(1,n,0);
m=rd();
for(i=1;i<=m;i++)
{
A=rd(),B=rd(),c=rd();
while(!pq.empty()) pq.pop();
for(j=1;j<=c;j++) pq.push(MP(1ll<<60,-1<<30));
query(root);
printf("%d\n",pq.top().second);
}
return 0;
}
//3 0 0 0 1 0 2 3 1 1 2 0 0 3 0 1 1
【BZOJ2626】JZPFAR kd-tree+堆的更多相关文章
- [学习笔记]K-D Tree
以前其实学过的但是不会拍扁重构--所以这几天学了一下 \(K-D\ Tree\) 的正确打开姿势. \(K\) 维 \(K-D\ Tree\) 的单次操作最坏时间复杂度为 \(O(k\times n^ ...
- 初涉k-d tree
听说k-d tree是一个骗分的好东西?(但是复杂度差评??? 还听说绍一的kdt常数特别小? KDT是什么 KDT的全称是k-degree tree,顾名思义,这是一种处理多维空间的数据结构. 例如 ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- K-D Tree题目泛做(CXJ第二轮)
题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...
- BZOJ 4520: [Cqoi2016]K远点对(k-d tree)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1162 Solved: 618[Submit][Status][Discuss] Descripti ...
- BZOJ4520:[CQOI2016]K远点对(K-D Tree)
Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...
- AOJ DSL_2_C Range Search (kD Tree)
Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- K-D Tree
这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...
- k-d Tree in TripAdvisor
Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...
随机推荐
- 使用Powerdesigner生成设计的数据表(一张或多张)的测试数据
设计表完成以后,我们需要生成一些测试数据,可以直接更新到数据库中,下面我们就来试试: 第一步:建立需要的Profiles测试文件,[Model]--[Test Data Profiles],如图所示: ...
- js-Flexbox盒子布局
这个年轻的时候,我在项目中其实很少用到: 现在老了,发现了他的好处,我就开始慢慢用到了: 但是其实我对他还是不熟悉的,很陌生,在此做个笔记,加油
- ES6十大特性
本文主要针对ES6做一个简要介绍. 主要译自: http://webapplog.com/ES6/comment-page-1/.也许你还不知道ES6是什么, 实际上, 它是一种新的javascri ...
- API网关服务Zuul-Spring Cloud学习第五天(非原创)
文章大纲 一.Zuul是什么二.Zuul的基本实现三.路由配置细节四.异常处理细节五.项目源码与参考资料下载六.参考文章 一.Zuul是什么 到目前为止,我们Spring Cloud中的内容已 ...
- 2016北京集训测试赛(十七)Problem A: crash的游戏
Solution 相当于要你计算这样一个式子: \[ \sum_{x = 0}^m \left( \begin{array}{} m \\ x \end{array} \right) \left( \ ...
- 翻译BonoboService官网的安装教程
This page covers simple Bonobo Git Server installation. Be sure to check prerequisites page before i ...
- 深入浅出 Cocoa 之 Core Data(4)- 使用绑定
深入浅出 Cocoa 之 Core Data(4)- 使用绑定 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 前面讲解了 Core Data 的框架, ...
- GCD和信号量
GCD 概念不多说,直接上代码.话说也不是什么高深的东东,不过极大简化了代码,一目了然.后面对信号量的记录也采用了相同的原理. //抛出线程 dispatch_async(dispatch_get_g ...
- Git之Github使用(一):Push代码到Github
Git之Github使用(一):Push代码到Github 热度 2已有 58 次阅读2016-8-26 17:56 |个人分类:常见问题|系统分类:移动开发| 互联网, commit, status ...
- appium查找元素心得
在使用appium测试app的时候并没有selenium那么好用,为什么呢? 个人觉得是因为定位方式太少,selenium中的xpath已经强大到基本可以找到任何一个元素. 但是在appium中xpa ...