题面

初见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. 2019CSUST集训队选拔赛题解(二)

    凛冬将至 Description 维斯特洛大陆的原住民是森林之子,他们长得如孩童一般,善于使用石器,威力值35,用树叶树枝作为衣物,在森林里繁衍生息,与万物和平相处.他们会使用古老的魔法(比如绿之视野 ...

  2. Mac环境搭建以太坊私有链

    原文地址: 石匠的blog 为了测试以太坊智能合约,最方便的是在本地搭建一个以太坊私有链.在mac上搭建环境主要需要以下步骤. geth安装 geth是go-ethereum的简写,是一个用go语言编 ...

  3. lscpu命令详解

    基础命令学习目录首页 一.lscpu输出 使用lscpu查看的结果如下图,这里会显示很多信息,如下: 使用lscpu -p会详细的numa信息,如下: [root@localhost ~]# lscp ...

  4. CocoaPods :为iOS程序提供依赖管理的工具(yoowei)

    修改于:2016.11.18   2017.1.10  2019.01.31 CocoaPods 源码 : https://github.com/CocoaPods/CocoaPods CocoaPo ...

  5. 爱码室Crawler & classification module项目工作分配

    项目情况 爬虫项目是上届学生遗留下来的项目,他们已经实现了基础的功能,而我们来负责完善,主要需要解决的问题是怎么让爬虫脱离爬和停的繁琐指令,更加的智能化.所以我们的计划是在前人的源码基础上,加以修改测 ...

  6. No.100_第一次团队会议

    任务的确立 这次会议,我们的主要目标是确定任务: 我们的任务有以下几个选择: 学霸网站,这个项目拥有以前的前端代码,我们再使用Django后端服务.上手难度较低,环境较好. 多平台时间管理软件. 安卓 ...

  7. [BUAA OO]第三次博客作业

    OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...

  8. 软工 · 第十二次作业 - Beta答辩总结

    福大软工 · 第十二次作业 - Beta答辩总结 写第十二次的时候操作失误直接在Beta版本的博客里改了...第七次冲刺的作业链接补在这里 Beta(7/7) 组长本次博客作业链接 项目宣传视频链接 ...

  9. 标头 header()函数的用法

    头 (header) 是服务器以 HTTP 协议传 HTML 资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔. 范例一: 本例使浏览器重定向到 PHP 的官方网站. <? ...

  10. Mac OS10.10 openfire无法启动问题

    1.我用的Java版本是Version 8 Update 51,验证方法可到这个网址下去验证http://www.java.com/zh_CN/download/installed.jsp 2.ope ...