解题:洛谷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 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
随机推荐
- eclipse xml文件中按alt+/没有提示信息
转载地址:http://blog.sina.com.cn/s/blog_972ddc1b01012mmh.html 今天要写这篇博文是因为遇到这样的不是技术的问题,但找到问题根源再解决这个问题又花费很 ...
- Python爬虫框架Scrapy学习笔记原创
字号 scrapy [TOC] 开始 scrapy安装 首先手动安装windows版本的Twisted https://www.lfd.uci.edu/~gohlke/pythonlibs/#twi ...
- React Native (0.57)开发环境搭建(注意:Node不要随便更新到最新版,更新完后莫名其妙的问题一大堆)
搭建开发环境 一.安装依赖 必须安装的依赖有:Node.Watchman 和 React Native 命令行工具以及 Xcode. 1.首先安装 Homebrew 2.安装 Node, Watchm ...
- 20172308 实验一《Java开发环境的熟悉》实验报告
20172308 2017-2018-2 <程序设计与数据结构>实验1报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...
- 猫咪记单词——NABCD模型分析
N ——Need 需求:学习英语是一件非常重要的事.面对各种各样的考试,学习英语,最重要的就是词汇量,背单词是提高词汇量的最直接的方法,但是单纯的背单词太单调.寻找一些合适的,更易于接受的背单词学习英 ...
- Teamwork(The seventh day of the team)
做了很久,发现还是运行不了,很郁闷: 求大神指教这是什么错误?
- JAVA 构造函数 静态变量
class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println(&quo ...
- 关于mybatis的思考(3)——ResultMaps的使用
ResultMap元素在mybatis中非常重要,目的是告诉mybatis将从结果集中取出的数据转换为开发者需要的对象. UserMapping.xml <!-- selectAll操作 ...
- Unity3D游戏开发——收集当前关卡游戏中分散的物件
运用场景 许多游戏中会有一些供玩家拾起的物件,例如装备.血包.道具等.当玩家与物件进行碰撞后,则会进入仓库. 本篇介绍了简单的碰撞过程. 原理 基本的碰撞机制,用到OnTriggerEnter()碰撞 ...
- Good Time 冲刺 六
一.今日完成任务情况 第六天 日期:2018.6.19 王怡镔:今天完善了页面,对部分不足进行改进. 于鑫宇:对界面进行完善. 胡雅馨:今天完成前端页面,并改善后端,完善项目. 黄 鹤:做完最后的打卡 ...