题面

初见K-D Tree

其实这样的题(欧几里得距离第$x$近点对)不应该用K-D Tree做,因为会被构造数据卡成$O(n^2)$,随机的另说。

但是并没有找到合适的K-D Tree的题(区域统计),于是就凑活着写了,代码极丑预警

 // luogu-judger-enable-o2
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
const long long inf=1e9;
struct a
{
int id;
long long ds;
};
bool operator < (a x,a y)
{
return x.ds==y.ds?x.id<y.id:x.ds>y.ds;
}
priority_queue<a> hp;
struct b
{
int ps[],mn[],mx[],sn[],id,idn;
}kdt[N],qry;
int n,m,k,r,f,typ;
inline void read(int &x)
{
x=,f=; char ch=getchar();
while(!isdigit(ch))
f|=ch=='-',ch=getchar();
while(isdigit(ch))
x=(x<<)+(x<<)+(ch^),ch=getchar();
x=f?-x:x;
}
void write(int x)
{
if(x>) write(x/);
putchar(x%^);
}
bool operator < (b x,b y)
{
return x.ps[typ]<y.ps[typ];
}
void Pushup(int nde)
{
kdt[nde].idn=kdt[nde].id;
int lson=kdt[nde].sn[],rson=kdt[nde].sn[];
b ls=kdt[lson],rs=kdt[rson];
if(lson) kdt[nde].idn=min(kdt[nde].idn,ls.idn);
if(rson) kdt[nde].idn=min(kdt[nde].idn,rs.idn);
for(int i=;i<=;i++)
{
kdt[nde].mn[i]=kdt[nde].mx[i]=kdt[nde].ps[i];
if(lson) kdt[nde].mn[i]=min(kdt[nde].mn[i],ls.mn[i]),kdt[nde].mx[i]=max(kdt[nde].mx[i],ls.mx[i]);
if(rson) kdt[nde].mn[i]=min(kdt[nde].mn[i],rs.mn[i]),kdt[nde].mx[i]=max(kdt[nde].mx[i],rs.mx[i]);
}
}
int Create(int l,int r,int k)
{
typ=k; int mid=(l+r)/;
nth_element(kdt+l,kdt+mid,kdt+r+);
if(l<mid) kdt[mid].sn[]=Create(l,mid-,k^);
if(r>mid) kdt[mid].sn[]=Create(mid+,r,k^);
Pushup(mid); return mid;
}
long long calc1(int nde)
{
long long mnx=kdt[nde].mn[]-qry.ps[],mxx=kdt[nde].mx[]-qry.ps[];
long long mny=kdt[nde].mn[]-qry.ps[],mxy=kdt[nde].mx[]-qry.ps[];
return max(mnx*mnx,mxx*mxx)+max(mny*mny,mxy*mxy);
}
long long calc2(int nde)
{
long long dsx=kdt[nde].ps[]-qry.ps[];
long long dsy=kdt[nde].ps[]-qry.ps[];
return dsx*dsx+dsy*dsy;
}
inline bool farther(long long x,long long y)
{
a t=hp.top();
return x>t.ds||(x==t.ds&&y<t.id);
}
inline bool further(long long x,long long y)
{
a t=hp.top();
return x>t.ds||(x==t.ds&&kdt[y].idn<t.id);
}
void Query(int nde)
{
b tmp=kdt[nde]; long long dis=calc2(nde);
int idx=tmp.id,lson=tmp.sn[],rson=tmp.sn[];
if(farther(dis,idx))
hp.pop(),hp.push((a){idx,dis});
long long d1=lson?calc1(lson):-inf,d2=rson?calc1(rson):-inf;
if(d1>d2)
{
if(further(d1,lson)) Query(lson);
if(further(d2,rson)) Query(rson);
}
else
{
if(further(d2,rson)) Query(rson);
if(further(d1,lson)) Query(lson);
}
}
int main()
{
register int i;
read(n);
for(i=;i<=n;i++)
read(kdt[i].ps[]),read(kdt[i].ps[]),kdt[i].id=i;
r=Create(,n,),scanf("%d",&m);
while(m--)
{
while(!hp.empty()) hp.pop();
read(qry.ps[]),read(qry.ps[]),read(k);
for(i=;i<=k;i++) hp.push((a){,-inf});
Query(r),write(hp.top().id),puts("");
}
return ;
}

解题:洛谷2093 JZPFAR的更多相关文章

  1. 洛谷2093 JZPFAR + KD-Tree学习笔记 (KD-Tree)

    KD-Tree这玩意还真的是有趣啊.... (基本完全不理解) 只能谈一点自己的对KD-Tree的了解了. 首先这个玩意就是个暴力... 他的结构有点类似二叉搜索树 每一层都是以一个维度作为划分标准. ...

  2. 【解题报告】洛谷 P2571 [SCOI2010]传送带

    [解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...

  3. 【解题报告】 洛谷 P3492 [POI2009]TAB-Arrays

    [解题报告] 洛谷 P3492 [POI2009]TAB-Arrays 这题是我随机跳题的时候跳到的.写完这道题之后,顺便看了一下题解,发现只有一篇题解,所以就在这里顺便写一个解题报告了. 首先当然是 ...

  4. 【解题报告】洛谷 P1231 教辅的组成

    [解题报告]洛谷 P1231 教辅的组成 题目链接 CSDN链接 这道题就只是一道普通的最大流问题,但是关键所在就是如何构图.要不是我看了题解,真的想不到这个构图方法呢 题目大意我就不写了,自己看好了 ...

  5. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  6. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  7. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

  8. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  9. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

随机推荐

  1. Hadoop源码编译环境搭建

    准备工具: maven 3.0.0版本或者更高版本(配置中心库) protocbuff 2.5.0 http://www.zlib.net/ git bash(Windows环境可以用此工具执行编译命 ...

  2. Maven ResourceBundle.getBundle读取Properties异常MissingResourceException: Can't find bundlei解决方法

    参考:https://blog.csdn.net/thousa_ho/article/details/72817616 问题描述 ResourceBundle读取properties配置文件提示 Mi ...

  3. python-五行红旗实现

    import turtle """ 绘制五星红旗 作者:zxj 版本:1.0 """ # 绘制矩形函数 def giant(leg,hig) ...

  4. 论文笔记:分形网络(FractalNet: Ultra-Deep Neural Networks without Residuals)

    FractalNet: Ultra-Deep Neural Networks without Residuals ICLR 2017 Gustav Larsson, Michael Maire, Gr ...

  5. Annotation 使用备忘

    title: Annotation 使用备忘 date: 2016-11-16 23:16:43 tags: [Annotation] categories: [Programming,Java] - ...

  6. oo第八次作业--5,6,7次作业总结

    一.多线程的设计 这三次作业的主要内容就是使用多线程并且解决多线程中出现的问题.而对于多线程我也有了自己的理解.首先明确的一点是单个CPU在同一时间只能处理一件事.那么,不管是多进程还是多线程,我们的 ...

  7. 第一次Sprint计划

    目标: 各成员先学习基于eclipse开发android应用软件的基本技术(砍柴要先磨刀,工具都没怎么做) 先弄一个简单的四则运算答题功能看看程序是否能在手机上运行 (以上为冲刺一内容) 时间: 5月 ...

  8. Virtualbox+Ubuntu安装,VERR_VMX_MSR_ALL_VMX_DISABLED解决

    学习链接:基于VirtualBox虚拟机安装Ubuntu图文教程--娄老师 启动虚拟机遇到的问题:BIOS中VT-x在所有CPU模式下被禁用(VERR_VMX_MSR_ALL_VMX_DISABLED ...

  9. Navicat Premium 连接Oracle 数据库

    昨天开始工作的时候听同事说:Navicat可以连各种数据库,包括Oracle,头一次听说!!!很是尴尬.现在记录一下怎么用Navicat连接Oracle.最重要的是,Navicat只支持32的Orac ...

  10. jquery on 事件嵌套 事件执行多次

    今天做了个项目,就是想点击添加然后追加一列,点击这一列的修改按钮,在修改, //编辑事件 $('#eventTable').on('click','.edit_n',function(){ var i ...