正题

题目链接:https://www.luogu.com.cn/problem/P4357


题目大意

平面上给出\(n\)个点,求第\(k\)远的点对距离。


解题思路

\(\text{K-Dtree}\)的模板题,但是这里只有二维,大概是每次根据一个维度把\(n\)个点分成两半像线段树一样丢到下面继续分治的思想来构建一棵树。

那么这样分割出来的每个节点的点分割了自己的矩形范围成了两个子节点的矩形范围。

这题的话我们就先构造出\(\text{K-Dtree}\)然后记录一下每个节点的矩形范围。

之后开一个小根堆,里面先丢\(2k\)个\(0\)(因为会算重),然后每次找到的一个点对距离如果比堆顶大就要换一个新的进堆就好了。

这样就保证了堆里存的是前\(2k\)大的点对了,之后每次用矩形范围判断一下新的答案是否在某个子节点的矩形里面。

理论上为了保证复杂度是需要替罪羊重构的,但是这题数据比较小就好很多。

因为\(k\)比较小所以能保证复杂度


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define ll long long
#define pw(x) ((x)*(x))
using namespace std;
const ll N=4e5+10,inf=1e18;
struct point{
ll x[2];
}w[N],p[N];
ll n,k,cnt,opt,mx[N][2],mi[N][2],ls[N],rs[N];
priority_queue<ll> q;
bool cmp(point x,point y)
{return x.x[opt]<y.x[opt];}
ll gdis(point x,point y)
{return pw(x.x[0]-y.x[0])+pw(x.x[1]-y.x[1]);}
ll limd(point x,ll y)
{return max(pw(x.x[0]-mx[y][0]),pw(x.x[0]-mi[y][0]))+max(pw(x.x[1]-mx[y][1]),pw(x.x[1]-mi[y][1]));}
void PushUp(ll x){
ll l=ls[x],r=rs[x];
mx[x][0]=mi[x][0]=w[x].x[0];
mx[x][1]=mi[x][1]=w[x].x[1];
if(l){
for(ll i=0;i<2;i++)mx[x][i]=max(mx[x][i],mx[l][i]);
for(ll i=0;i<2;i++)mi[x][i]=min(mi[x][i],mi[l][i]);
}
if(r){
for(ll i=0;i<2;i++)mx[x][i]=max(mx[x][i],mx[r][i]);
for(ll i=0;i<2;i++)mi[x][i]=min(mi[x][i],mi[r][i]);
}
return;
}
void Build(ll &x,ll l,ll r,ll z){
if(l>r)return;x=++cnt;
ll mid=(l+r)>>1;opt=z;
nth_element(p+l,p+mid,p+r+1,cmp);
w[x]=p[mid];
Build(ls[x],l,mid-1,z^1);
Build(rs[x],mid+1,r,z^1);
PushUp(x);return;
}
void Query(ll x,point v){
if(!x)return;
ll dl=-inf,dr=-inf;
if(ls[x])dl=limd(v,ls[x]);
if(rs[x])dr=limd(v,rs[x]);
ll dis=gdis(w[x],v);
if(dis>-q.top())q.pop(),q.push(-dis);
if(dl>dr){
if(dl>-q.top())Query(ls[x],v);
if(dr>-q.top())Query(rs[x],v);
}
else{
if(dr>-q.top())Query(rs[x],v);
if(dl>-q.top())Query(ls[x],v);
}
return;
}
signed main()
{
scanf("%lld%lld",&n,&k);
for(ll i=1;i<=n;i++)
scanf("%lld%lld",&p[i].x[0],&p[i].x[1]);
ll rt;Build(rt,1,n,0);
for(ll i=1;i<=2*k;i++)q.push(0);
for(ll i=1;i<=n;i++)Query(1,p[i]);
printf("%lld\n",-q.top());
}

P4357-[CQOI2016]K远点对【K-Dtree】的更多相关文章

  1. P4357 [CQOI2016]K远点对(KDTree)

    传送门 又一次产生了KDTree本质就是爆搜的感觉-- 大概就类似于p4169,只不过是从最近点对变成了第\(k\)远点对 我们开一个小根堆,里面放\(k\)个元素,起初全为\(0\),然后每一次都把 ...

  2. P4357 [CQOI2016]K远点对

    题意:给定平面中的 \(n\) 个点,求第 \(K\) 远的点对之间的距离,\(n\leq 1e5,K\leq min(100,\frac{n\times (n-1)}{2})\) 题解:kd-tre ...

  3. BZOJ 4520: [Cqoi2016]K远点对

    4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 638  Solved: 340[Submit][Status ...

  4. [BZOJ4520][Cqoi2016]K远点对 kd-tree 优先队列

    4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1285  Solved: 708[Submit][Statu ...

  5. 【BZOJ4520】[Cqoi2016]K远点对 kd-tree+堆

    [BZOJ4520][Cqoi2016]K远点对 Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 ...

  6. LibreOJ2043 - 「CQOI2016」K 远点对

    Portal Description 给出平面上的\(n(n\leq10^5)\)个整点,求在欧几里得距离下第\(k\)远的点对之间的距离. Solution k-d树+堆. 用小根堆维护当前找到的第 ...

  7. [bzoj4520][Cqoi2016]K远点对_KD-Tree_堆

    K远点对 bzoj-4520 Cqoi-2016 题目大意:已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. 注释:$1\le n\le 10^5$,$1\le k\le 100$,$k\l ...

  8. [Cqoi2016]K远点对 K-Dtree

    4520: [Cqoi2016]K远点对 链接 bzoj 思路 用K-Dtree求点的最远距离. 求的时候顺便维护一个大小为2k的小根堆. 不知道为啥一定会对. 代码 #include <bit ...

  9. BZOJ4520 [Cqoi2016]K远点对

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  10. 【bzoj4520】 Cqoi2016—K远点对

    http://www.lydsy.com/JudgeOnline/problem.php?id=4520 (题目链接) 题意 求平面内第K远点对的距离. Solution 左转题解:jump 细节 刚 ...

随机推荐

  1. css内容渐入效果实现

    .fade-in-section { opacity: 0; transform: translateY(20vh); visibility: hidden; transition: opacity ...

  2. mzy,struts学习(二):struts.xml的配置

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...

  3. 对于Oracle、mysql和sql server中的部分不同理解

    1.在mysql中事务默认是自动提交的,只有设置autocommit为0的时候,才用自己commit:(提到commit不要忘了rollback哦,回滚)2.但是在oracle中必须自己commit: ...

  4. rEFI引导Win10+Ubuntu14双系统

    公司买了一台Alienware 15 R2,安装双系统折腾死我了,现在记录一下安装过程. 硬盘: 256固态+1T机械 安装顺序: 先Windows,再Ubuntu 不同BIOS启动方式下安装系统 U ...

  5. 用CUDA写出比Numpy更快的规约求和函数

    技术背景 在前面的几篇博客中我们介绍了在Python中使用Numba来写CUDA程序的一些基本操作和方法,并且展示了GPU加速的实际效果.在可并行化的算法中,比如计算两个矢量的加和,或者是在分子动力学 ...

  6. JMeter中使用交替控制器设置循环次数后都执行一次?

    JMeter在线程组设置循环3次,执行后只执行了一次就停止执行了 排查原因:线程组下添加了一些请求信息(HTTP Cache Manager.HTTP Cookie Manager.HTTP Requ ...

  7. 前后端数据交互(六)——ajax 、fetch 和 axios 优缺点及比较

    一.ajax.fetch 和 axios 简介 1.1.ajax ajax是最早出现发送后端请求的技术,属于原生 js .ajax使用源码,请点击<原生 ajax 请求详解>查看.一般使用 ...

  8. idea配置tomcat及中文乱码解决

    放在前面:不要使用tomcat10,访问自己的页面会报404错误,目前无解,在这个坑爬了一下午,最终换了tomcat 9才解决.所以我选择了tomcat 9 + idea 2021.2版本 配置步骤: ...

  9. Defence

      emm...这道题我调了一下午你敢信??   好吧还是我太天真了.   开始的时候以为自己线段树动态开点与合并写错了,就调;   结果发现没问题,那就是信息维护错了.   一开始以为自己最左右的1 ...

  10. Appium问题解决方案(3)- java.lang.IllegalStateException: UiAutomation not connected!

    背景 连着手机,运行脚本,一段时间之后就报错了,看了Appium-server,发现报了这样一个错误 如何解决呢? 步骤一 通过 adb devices ,确定设备是否已连接上 步骤二(最终解决方案) ...