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

题解:kd-tree + priority_queue

size 为 \(2\times K\) 的小根堆记录当前 前 \(2\times K\) 远的点对,并以此为在搜索时剪枝的依据。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#define R register int
#define ll long long
using namespace std;
namespace Luitaryi {
static char B[1<<15],*S=B,*T=B;
#define getchar() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
inline int g() { R x=0,f=1;
register char s; while(!isdigit(s=getchar())) f=s=='-'?-1:f;
do x=x*10+(s^48); while(isdigit(s=getchar())); return x*f;
} const int N=100010,Inf=0x3f3f3f3f;
int n,m,rt,D;
struct P { int d[2];
inline int& operator [](int src) {return d[src];}
inline bool operator < (const P& that) const
{return d[D]<that.d[D];}
}p[N],s;
priority_queue<ll,vector<ll>,greater<ll> > q;
struct node {
int lc,rc,mx[2],mn[2]; P p;
#define ls (t[tr].lc)
#define rs (t[tr].rc)
#define mx(tr,i) (t[tr].mx[i])
#define mn(tr,i) (t[tr].mn[i])
#define P(tr,i) (t[tr].p.d[i])
}t[N];
inline void upd(int tr) {
for(R i=0;i<2;++i) {
mx(tr,i)=max(mx(tr,i),max(mx(ls,i),mx(rs,i)));
mn(tr,i)=min(mn(tr,i),min(mn(ls,i),mn(rs,i)));
}
}
inline void build(int& tr,int l,int r,int dim) {
R md=l+r>>1; tr=md; D=dim,nth_element(p+l,p+md,p+r+1);
t[tr].p=p[md]; for(R i=0;i<2;++i) mx(tr,i)=mn(tr,i)=P(tr,i);
if(l<md) build(ls,l,md-1,dim^1);
if(md<r) build(rs,md+1,r,dim^1); upd(tr);
}
#define sqr(x) ((ll)(x)*(x))
inline ll cal(P p) {
return sqr(p[0]-s[0])+sqr(p[1]-s[1]);
}
inline ll cal(int tr) {
return max(sqr(s[0]-mn(tr,0)),sqr(s[0]-mx(tr,0)))
+max(sqr(s[1]-mn(tr,1)),sqr(s[1]-mx(tr,1)));
}
inline void query(int tr) {
register ll dis=cal(t[tr].p),ldis=-Inf,rdis=-Inf;
if(dis>q.top()) q.pop(),q.push(dis);
if(ls) ldis=cal(ls); if(rs) rdis=cal(rs);
if(ldis>rdis) {
if(ldis>q.top()) query(ls);
if(rdis>q.top()) query(rs);
} else {
if(rdis>q.top()) query(rs);
if(ldis>q.top()) query(ls);
}
}
inline void main() {
n=g(),m=g()*2; mx(0,0)=mx(0,1)=-Inf,mn(0,0)=mn(0,1)=Inf;
for(R i=1;i<=n;++i) p[i].d[0]=g(),p[i].d[1]=g();
build(rt,1,n,0); for(R i=1;i<=m;++i) q.push(0);
for(R i=1;i<=n;++i) s=p[i],query(rt);
printf("%lld\n",q.top());
}
} signed main() {Luitaryi::main(); return 0;}

P4357 [CQOI2016]K远点对的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [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 ...

  7. BZOJ4520 [Cqoi2016]K远点对

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

  8. 【bzoj4520】 Cqoi2016—K远点对

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

  9. BZOJ 4520 [Cqoi2016]K远点对(KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4520 [题目大意] 求K远点对距离 [题解] 修改估价函数为欧式上界估价,对每个点进行 ...

随机推荐

  1. 【C++札记】友元

    C++封装的类增加了对类中数据成员的访问限制,从而保证了安全性.如想访问类中的私有成员需要通过类中提供的公共接口来访问,这样间接的访问方式,无疑使得程序的运行效率有所降低. 友元的提出可以使得类外的函 ...

  2. 39 多线程(十一)——ThreadLocal

    目前阶段,我只能知其然,不能做到知其所以然,这里引用一篇其所以然的文章,为以后理解ThreadLocal做准备: https://www.cnblogs.com/ldq2016/p/9041856.h ...

  3. python3的 基础

    ]print(list(set(lst))) # 面试题: # a = 10 # b = 20 # a,b = b,a      # 10000% # print(b)  # 10 # print(a ...

  4. 如何配置php session使用redis集群

    本实例基于phpredis 2.2.8,支持集群处理,php5.3及以上. 1.页面修改: ini_set('session.save_handler', 'rediscluster'); ini_s ...

  5. JSVC安装

    执行./start-all.sh启动hadoop时报错 Starting datanodes node1: ERROR: Cannot set priority of datanode process ...

  6. GZOI/GXOI2019

    陆陆续续做完了-- 与或和(单调栈) 这是一道一眼题-- 看到位运算,按位考虑贡献.对于每一位,将矩阵中的元素变为"当前元素的这一位是否为\(1\)",那么原矩阵变为\(01\)矩 ...

  7. MVC模式和Maven项目构建

    1.    尽管Servlet + JSP可以完成全部的开发工作,但是代码耦合度高.可读性差.重用性不好,维护.优化也不方便.所以才有了MVC. MVC是当前WEB开发的主流模式,核心是使用Strut ...

  8. iOS - Base64转图片&&图片转Base64

    记录一个小功能 app传base64位上去,服务器拿到后转图片保存,当app请求拿回用户图片时,服务器再把图片转base64字符串返回给app,app再转图片 // 64base字符串转图片 - (U ...

  9. 【开发工具】- Xshell工具的下载和安装

    下载地址:https://www.netsarang.com/zh/free-for-home-school/ Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Micro ...

  10. js造成内存泄漏的几种情况

    1.介绍js的垃圾回收机制 js的垃圾回收机制就是为了防止内存泄漏的,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的 ...