解题:洛谷2093 JZPFAR
初见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的更多相关文章
- 洛谷2093 JZPFAR + KD-Tree学习笔记 (KD-Tree)
KD-Tree这玩意还真的是有趣啊.... (基本完全不理解) 只能谈一点自己的对KD-Tree的了解了. 首先这个玩意就是个暴力... 他的结构有点类似二叉搜索树 每一层都是以一个维度作为划分标准. ...
- 【解题报告】洛谷 P2571 [SCOI2010]传送带
[解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...
- 【解题报告】 洛谷 P3492 [POI2009]TAB-Arrays
[解题报告] 洛谷 P3492 [POI2009]TAB-Arrays 这题是我随机跳题的时候跳到的.写完这道题之后,顺便看了一下题解,发现只有一篇题解,所以就在这里顺便写一个解题报告了. 首先当然是 ...
- 【解题报告】洛谷 P1231 教辅的组成
[解题报告]洛谷 P1231 教辅的组成 题目链接 CSDN链接 这道题就只是一道普通的最大流问题,但是关键所在就是如何构图.要不是我看了题解,真的想不到这个构图方法呢 题目大意我就不写了,自己看好了 ...
- 洛谷 P2058 海港 解题报告
P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3956 棋盘 解题报告
P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
随机推荐
- window搭建私有云,只要几分钟
本文介绍如何在window搭建私有云网盘. 工具/原料:一台window系统电脑或者window服务器(vps),Xampp 安装包,可道云kodexplorer安装包 第一步,xampp安装 1.官 ...
- uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法
如果在编译MFC程序的时候出现下列及类似的错误: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator ...
- Streamr助你掌控自己的数据(1)——教你5分钟上传数据至Streamr
博客说明 所有刊发内容均可转载但是需要注明出处. 教你5分钟上传数据至Streamr 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...
- deep learning loss总结
在深度学习中会遇到各种各样的任务,我们期望通过优化最终的loss使网络模型达到期望的效果,因此loss的选择是十分重要的. cross entropy loss cross entropy loss和 ...
- OSSEC 架构
OSSEC由很多部分组成,它有一个集中的管理端,用于监控.并接收来自代理.syslog.数据库或无代理设备的日志. 管理端(服务器) 管理端属于OSSEC部署中的中心部分.它存储了文件完整性检测数据库 ...
- js中使用对象注意
var myObject = { hello: '你好', world : '世界' } 正常使用 myObject.hello //输出你好 若引用的属性本身是一个变量: 需要用方括号使用 va ...
- LeetCode 303. Range Sum Query - Immutable (C++)
题目: Given an integer array nums, find the sum of the elements between indices iand j (i ≤ j), inclus ...
- 奔跑吧DKY——团队Scrum冲刺阶段-Day 2
今日完成任务 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如果完成的任务为调研任务,需给出对应的调研总结博客链接:如果完成的任务为学习技术任务,需 ...
- c# 程序重启设定
问题情境: 程序随着时间运行,越来越大.暂时想到的两种方法,一是反攻代码,查看占内存大的函数,是不是没有回收.再就是暴力设定程序定时重启. 解决原理: 定时重启:暂设定timer,时间匹配执行rest ...
- bata6
目录 组员情况 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团队签入记 ...