题目链接

思路

这个"\(K\)远“点对一直理解成了距离第\(K\)大的点对\(233\)。

要求第\(K\)远,那么我们只要想办法求出来最远的\(K\)个点对就可以了。

用一个大小为\(2K\)(因为每个点对会被统计两次)的小头堆维护距离最大的\(K\)个点对,然后在\(KD-tree\)上查询最远点对,如果查到的点对之间的距离比堆顶大,那么就把堆顶弹出来,当前距离插进去。

最后堆顶元素就是答案。

代码

/*
* @Author: wxyww
* @Date: 2019-06-13 07:45:59
* @Last Modified time: 2019-06-13 08:47:21
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
#define int ll
const int N = 100100,INF = 1e9;
#define ls TR[rt].ch[0]
#define rs TR[rt].ch[1]
priority_queue<int,vector<int>,greater<int> >q;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int mul(int x) {
return x * x;
}
struct node {
int ch[2],d[2],mx[2],mn[2];
}TMP,TR[N],a[N];
int D;
bool cmp(const node &A,const node &B) {
return A.d[D] < B.d[D];
}
void up(int rt) {
for(int i = 0;i <= 1;++i) {
if(ls) TR[rt].mx[i] = max(TR[ls].mx[i],TR[rt].mx[i]),
TR[rt].mn[i] = min(TR[ls].mn[i],TR[rt].mn[i]);
if(rs) TR[rt].mx[i] = max(TR[rs].mx[i],TR[rt].mx[i]),
TR[rt].mn[i] = min(TR[rs].mn[i],TR[rt].mn[i]);
}
}
int build(int l,int r,int now) {
D = now;
int mid = (l + r) >> 1;
nth_element(a + l,a + mid,a + r + 1,cmp);
TR[mid] = a[mid];
for(int i = 0;i <= 1;++i) TR[mid].mx[i] = TR[mid].mn[i] = TR[mid].d[i];
int rt = mid;
if(l < mid) ls = build(l,mid - 1,now ^ 1);
if(r > mid) rs = build(mid + 1,r,now ^ 1);
up(mid);
return mid;
}
int dis(const node &A,const node &B) {
return mul(A.d[0] - B.d[0]) + mul(A.d[1] - B.d[1]);
}
int get(const node &A,const node &B) {
int ret = 0;
for(int i = 0;i <= 1;++i)
ret += mul(max(abs(A.d[i] - B.mx[i]),abs(A.d[i] - B.mn[i])));
return ret;
}
void query(int rt) {
int K = dis(TMP,TR[rt]);
if(K > q.top()) q.pop(),q.push(K);
int dl = -INF,dr = -INF;
if(ls) dl = get(TMP,TR[ls]);
if(rs) dr = get(TMP,TR[rs]);
if(dl > dr) {
if(dl > q.top()) query(ls);
if(dr > q.top()) query(rs);
}
if(dr > dl) {
if(dr > q.top()) query(rs);
if(dl > q.top()) query(ls);
}
}
int X[N],Y[N];
signed main() {
int n = read(),K = read();
for(int i = 1;i <= n;++i) {
X[i] = a[i].d[0] = read();Y[i] = a[i].d[1] = read();
}
int root = build(1,n,0);
for(int i = 1;i <= K * 2;++i) q.push(0);
for(int i = 1;i <= n;++i) {
TMP.d[0] = X[i],TMP.d[1] = Y[i];
query(root);
}
cout<<q.top();
return 0;
}

bzoj4520 K远点对的更多相关文章

  1. 【bzoj4520】 Cqoi2016—K远点对

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

  2. 【bzoj4520】K远点对

    Portal --> bzoj4520 Description 给你平面内\(n\)个点的坐标,求欧氏距离下第\(k\)远的点对 Solution 因为kd其实..严格来说挺不熟的用的太少了qw ...

  3. 【BZOJ4520】K远点对(KD-Tree)

    [BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...

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

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

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

  6. BZOJ4520 [Cqoi2016]K远点对

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

  7. 【BZOJ-4520】K远点对 KD-Tree + 堆

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

  8. BZOJ4520:[CQOI2016]K远点对(K-D Tree)

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

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

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

随机推荐

  1. networkx生成网络的子网计算

    当我们用networkx生成网络时,节点之间的关系是随机的,很多时候我们生成的一个网络,存在不止一个子网,也就是说任意两个节点之间不一定连通 当我们想生成一个任意两点都能连通的网络时,就需要去判断生成 ...

  2. golang--海量用户即使通讯系统

    功能需求: 用户注册 用户登录 显示在线用户列表 群聊 点对点聊天 离线留言

  3. Fuzzy finder(fzf+vim) 使用入门指南

    今天无意中尝试了fzf,才发现这个工具的威力无穷,毕竟是非常好的工具,第一次都把它的优点都释放出来也不现实,先熟悉一下吧,后面在实战中再不断地学习总结. 它是什么: Fuzzy finder 是一款使 ...

  4. 抓包工具之fiddler实战2-设置断点

    Fiddler作为抓工具包,功能强大,作为代理服务器,可以对抓获到的请求或响应进行修改,然后模拟客户端发送新的请求或模拟服务器返回修改后的响应结果. Fiddler中设置断点修改Request Fid ...

  5. 拎壶学python3-----(1)输出与字符转换

    一.输入自己的名字打印 二.数字和字符串是不能相加的如下 怎么解决上边的问题呢? 如果是相加我们要把字符串转成数字类型如下 如果不想让他相加可以写成这样如下: ok,关于转换就先讲到这里

  6. Docker学习——Dockerfile

    上一篇我们讲了docker的基本使用,掌握了前一篇,docker使用基本不成问题,但是要是你学习了Dockerfile,你会发现它使用起来有多方便了.项目最终部署时,我们希望docker容器打开时项目 ...

  7. 浏览器关闭后Session真的消失了吗?

    今天想和大家分享一个关于Session的话题: 当浏览器关闭时,Session就被销毁了?  我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保 存当前用户的状态信 ...

  8. ReSharper激活方法

    激活方式选择License Keys. 激活码: MTW881U3Z5-eyJsaWNlbnNlSWQiOiJNVFc4ODFVM1o1IiwibGljZW5zZWVOYW1lIjoiTnNzIElt ...

  9. Java入门——初识Java

    Java入门——初识Java 摘要:本文主要对Java这门编程语言进行简单的介绍. Java简介 说明 Java语言历时十多年,已发展成为人类计算机史上影响深远的编程语言,从某种程度上来看,它甚至超出 ...

  10. FCC---Create Visual Direction by Fading an Element from Left to Right---一个带好看背景色的圆形图案,从左到右移动,透明度opacity渐变为0.1,背景色渐渐消失的效果

    For this challenge, you'll change the opacity of an animated element so it gradually fades as it rea ...