题意:给定平面中的 \(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. OSGI.NET插件方式开发你的应用

    之前一直从事C# WEB开发.基本都是业务开发,性能优化. 体力活占比90%吧.模块真的很多很多,每次部署经常出先各种问题.发布经常加班. 今年开始接触winform 开发.发现C# 的事件  委托 ...

  2. 『Go基础』第8节 格式化输出

    输出就是将数据信息打印到电脑屏幕上. 本节我们就来学习一下Go语言中的三种输出方式: Print().Println().Printf(). 1.Print() Print()主要的一个特点就是打印数 ...

  3. 基于CentOS6.5的Dubbo及Zookeeper配置

    基于CentOS的Dubbo及Zookeeper配置 需要提前准备好的资料: 1.首先配置java环境 步骤: 将jdk的包上传至centos服务器的/opt目录下,并且解压 tar -zxvf jd ...

  4. c# Path.Combine

    Path.Combine: c#获取当前项目路径 : //获取包含当前执行的代码的程序集的加载文件的完整路径 var appPath = System.IO.Path.GetDirectoryName ...

  5. java之单元测试

    这篇主要简单讲下java的单元测试 目录结构如下: 如图,其中1是需要被测试的功能:2是测试模块:3是单元测试需要的引入包: 1. 功能模块1中 Calculator 的代码: package cn. ...

  6. Centos Consul集群及Acl配置

    一,准备工作 准备四台centos服务器,三台用于consul server 高可用集群,一台用于consul client作服务注册及健康检查.架构如下图所示 二,在四台服务器上安装consul 1 ...

  7. 隐马尔可夫模型(HMM)的分类

    1.遍历型(ergodic model) 即每个状态都可以由任意一个状态演变而来,aij>0,for all i , j. 如图: 2.left-right type of HMM 每个状态只能 ...

  8. 深入理解JVM(二)--对象的创建

    Java是一门面向对象的语言,在Java程序运行的过程中,无时无刻都会有对象被创建出来,在程序语言中,创建对象(例如克隆,反序列化)通常仅仅是一个new关键字,但是在虚拟机中是怎样的呢?本文主要了解一 ...

  9. 【开发笔记】- Linux命令大全

    系统信息  arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  10. vue中如何判断checkbox是否选中

    console.log(event.target.checked)     例: