暴力的做法应该是这样的,维护大小为k的堆,每次插入两点间距离并弹出堆顶。

然后这个做法显然是可以KD-Tree优化的,建立KD-Tree,然后如果该平面内最远点小于堆顶,则直接退出。就当做是复习很久没做的KD-Tree了。

不过有一个细节要注意,求最远点对,(1,2)->(2,1)算一对,所以堆的大小应该是2*k

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
struct point{ll d[];}a[N];
struct node{int mn[],mx[],lc,rc;point a;}t[N];
priority_queue<ll,vector<ll>,greater<ll> >q;
int n,m,rt,D;
bool operator<(point a,point b){return a.d[D]<b.d[D];}
void pushup(int x,int y)
{
t[x].mn[]=min(t[x].mn[],t[y].mn[]);
t[x].mn[]=min(t[x].mn[],t[y].mn[]);
t[x].mx[]=max(t[x].mx[],t[y].mx[]);
t[x].mx[]=max(t[x].mx[],t[y].mx[]);
}
void build(int&k,int l,int r,int d)
{
k=;
if(l>r)return;
D=d;
int mid=l+r>>;
nth_element(a+l,a+mid,a+r+);
k=mid;
t[k].mn[]=t[k].mx[]=t[k].a.d[]=a[k].d[];
t[k].mn[]=t[k].mx[]=t[k].a.d[]=a[k].d[];
build(t[k].lc,l,mid-,d^);
if(t[k].lc)pushup(k,t[k].lc);
build(t[k].rc,mid+,r,d^);
if(t[k].rc)pushup(k,t[k].rc);
}
ll getdis(point a,point b)
{return(a.d[]-b.d[])*(a.d[]-b.d[])+(a.d[]-b.d[])*(a.d[]-b.d[]);}
ll getdis2(point a,node b)
{
ll ret=;
ret=max(ret,getdis(a,(point){b.mn[],b.mn[]}));
ret=max(ret,getdis(a,(point){b.mn[],b.mx[]}));
ret=max(ret,getdis(a,(point){b.mx[],b.mn[]}));
ret=max(ret,getdis(a,(point){b.mx[],b.mx[]}));
return ret;
}
void query(int k,point a)
{
ll dis=getdis(a,t[k].a);
if(dis>q.top())q.pop(),q.push(dis);
if(t[k].lc)
{
dis=getdis2(a,t[t[k].lc]);
if(dis>q.top())query(t[k].lc,a);
}
if(t[k].rc)
{
dis=getdis2(a,t[t[k].rc]);
if(dis>q.top())query(t[k].rc,a);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%lld%lld",&a[i].d[],&a[i].d[]);
build(rt,,n,);
for(int i=;i<=m*;i++)q.push();
for(int i=;i<=n;i++)query(rt,a[i]);
printf("%lld",q.top());
}

[CQOI2016]K远点对(KD-Tree)的更多相关文章

  1. BZOJ 4520: [Cqoi2016]K远点对(k-d tree)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1162  Solved: 618[Submit][Status][Discuss] Descripti ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ4520:[CQOI2016]K远点对

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

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

  10. BZOJ4520 [Cqoi2016]K远点对

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

随机推荐

  1. mysql 权限管理 grant revoke

    grant all privileges  on  database.table to 'user'@'ip' identified by 'passwd' with grant  option; g ...

  2. 强大的promise

    这个玩意叫做普罗米修斯,希腊神话的盗火英雄 promise只用来包装异步函数,同步的会搞乱执行顺序,生产BUG // 如何使用 function pro(){ return new Promise(f ...

  3. 入门QT5 D1 Widget的移动

    又重温了一遍C++之后来看QT教程了.QT之前也看过,不过都是很长时间之前了,一直也用到. 反过来再一学,这是和学新的是一样一样的. 首先创建新项目. 1.点击NEW PROJECT 2.Applit ...

  4. P1001 害死人不偿命的(3n+1)猜想 (Basic Level)

    转跳点:

  5. NASA航天技术演示实验集

    为了支持太空探索NASA开起了一系列先进太空技术演示实验. 具体的实验实验地址在:https://www.nasa.gov/mission_pages/tdm/main/overview.html 通 ...

  6. 51nod 1055:最长等差数列

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  取消关注 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 ...

  7. HDU 4902 Nice boat 多校4 线段树

    给定n个数 第一个操作和普通,区间覆盖性的,把l-r区间的所有值改成固定的val 第二个操作是重点,输入l r x 把l-r区间的所有大于x的数,变成gcd(a[i],x) a[i]即指满足条件的序列 ...

  8. Linux学习43 CCNA网络知识-计算机网络基础

    一.Linux网络配置属性 1.计算机网络 TCP/IP:协议簇,协议栈(使用的模型) ISO组织制定了OSI七层模型协议栈(学习的模型) 2.网卡 a.MAC:Media Access Contro ...

  9. Node.js NPM 教程

    NPM是Node.js的包(或模块)管理器,是Node.js应用程序开发的核心. www.npmjs.com上有海量的Node.js包,供免费下载使用. 当安装Node.js时,NPM程序会被同时安装 ...

  10. vue路由 视图命名

    <body> <div id="app"> <p @click="go">hello app!</p> < ...