解题:洛谷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 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
随机推荐
- c++ 整数和字符串的转化
一.string转int的方式 采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了. 采用标准库中atoi函数. "; int a = ...
- 编写和调试Android下JNI程序流程
1,切换到Android目录下bin/classes,使用javah命令生成jni所需的头文件,命令类似于:javah com.xxx.ooo,其中,com.xxx为package名称,ooo为包含n ...
- Erlang数据类型的表示和实现(2)——Eterm 和立即数
Erlang 数据类型的内部表示和实现 Erlang 中的变量在绑定之前是自由的,非绑定变量可以绑定一次任意类型的数据.为了支持这种类型系统,Erlang 虚拟机采用的实现方法是用一个带有标签的机器字 ...
- ltrace命令详解
原文链接:https://ipcmen.com/ltrace 用来跟踪进程调用库函数的情况 补充说明 NAME ltrace - A library call tracer ltrace命 ...
- 解读Python编程中的命名空间与作用域
变量是拥有匹配对象的名字(标识符).命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典.一个Python表达式可以访问局部命名空间和全局命名空间里的变量.如果一个局部变量和一个全局 ...
- Scrum Meeting 2 -2014.11.2
今天大家读完代码后又聚在了一块讨论了许多.确定了重点的任务和分工细节.提出了许多问题和改进的方案.还有讨论分析了关于团队作业 - 软件分析和用户需求调查,初步决定目标软件为必应的输入法和词典,团队为争 ...
- Daily Scrum9 11.13
昨天的任务已完成. 今日任务: 姓名 今日任务 时长 徐钧鸿 测试SQL包里的代码 2h 张艺 继续搭建还没搭建完的框架 修复bug 2h 黄可嵩 继续进行搜索响应编写 2h 徐方宇 搭建框架 修改b ...
- 20162328蔡文琛 week05 大二
20162328 2017-2018-1 <程序设计与数据结构>第5周学习总结 教材学习内容总结 集合是收集元素并组织其他对象的对象. 集合中的元素一般由加入集合的次序或元素之间的某些固有 ...
- oracle 分页的sql语句
已知有两种方法效率上貌似第一种更优: 1. select * from( select t1.*, rownum n from (select * from cm_log order by oper_ ...
- Java 多生产者消费者问题
/* 生产者,消费者. 多生产者,多消费者的问题. if判断标记,只有一次,会导致不该运行的线程运行了.出现了数据错误的情况. while判断标记,解决了线程获取执行权后,是否要运行! not ...