【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4520

【题目大意】

  求K远点对距离

【题解】

  修改估价函数为欧式上界估价,对每个点进行dfs,
  因为是无向点对,在小根堆中保留前2k个距离,
  不断更新堆顶元素即可。

【代码】

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int N=200000;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct data{
LL dis;
data(){};
data(const LL&x){dis=x;}
bool operator <(const data&x)const{return dis>x.dis;}
}tmp;
priority_queue<data>q;
namespace KD_Tree{
struct Dot{
int d[2],mn[2],mx[2],l,r;
Dot(){l=r=0;}
Dot(int x,int y){d[0]=x;d[1]=y;l=r=0;}
int& operator [] (int x){return d[x];}
};
int D,dcnt=0,pt[N];
Dot T[N],p[N];
bool operator<(Dot a,Dot b){return a[D]<b[D];}
inline void umax(int&a,int b){if(a<b)a=b;}
inline void umin(int&a,int b){if(a>b)a=b;}
inline bool cmp(int x,int y){return T[x][D]<T[y][D];}
inline void up(int x){
T[x].mn[0]=T[x].mx[0]=T[x][0];
T[x].mn[1]=T[x].mx[1]=T[x][1];
if(T[x].l){
umax(T[x].mx[0],T[T[x].l].mx[0]);
umin(T[x].mn[0],T[T[x].l].mn[0]);
umax(T[x].mx[1],T[T[x].l].mx[1]);
umin(T[x].mn[1],T[T[x].l].mn[1]);
}
if(T[x].r){
umax(T[x].mx[0],T[T[x].r].mx[0]);
umin(T[x].mn[0],T[T[x].r].mn[0]);
umax(T[x].mx[1],T[T[x].r].mx[1]);
umin(T[x].mn[1],T[T[x].r].mn[1]);
}
}
void AddDot(int x,int y){
++dcnt; pt[dcnt]=dcnt;
p[dcnt][0]=x; p[dcnt][1]=y;
}
int build(int l,int r,int now){
if(l>r)return 0;
int mid=(l+r)>>1;
D=now;
nth_element(p+l,p+mid,p+r+1);
T[mid]=p[mid];
for(int i=0;i<2;i++)T[mid].mn[i]=T[mid].mx[i]=T[mid][i];
if(l<mid)T[mid].l=build(l,mid-1,now^1);
if(r>mid)T[mid].r=build(mid+1,r,now^1);
return up(mid),mid;
}
LL sqr(LL x){return x*x;}
inline LL dist(int x,int px,int py){
LL dis=0;
if(!x)return 0;
dis+=max(sqr(T[x].mn[0]-px),sqr(T[x].mx[0]-px));
dis+=max(sqr(T[x].mn[1]-py),sqr(T[x].mx[1]-py));
return dis;
}
}
void query(int x,int px,int py){
if(!x)return;
LL dl,dr,d0=sqr(T[x][0]-px)+sqr(T[x][1]-py);
dl=T[x].l?dist(T[x].l,px,py):0;
dr=T[x].r?dist(T[x].r,px,py):0;
if(d0>q.top().dis)q.pop(),q.push(data(d0));
if(dl>dr){
if(dl>q.top().dis)query(T[x].l,px,py);
if(dr>q.top().dis)query(T[x].r,px,py);
}
else{
if(dr>q.top().dis)query(T[x].r,px,py);
if(dl>q.top().dis)query(T[x].l,px,py);
}
}
}
int n,k;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)KD_Tree::AddDot(read(),read());
int root=KD_Tree::build(1,n,0);
for(int i=0;i<k+k;i++)q.push(tmp);
for(int i=1;i<=n;i++)KD_Tree::query(root,KD_Tree::p[i][0],KD_Tree::p[i][1]);
printf("%lld\n",q.top().dis);
return 0;
}

BZOJ 4520 [Cqoi2016]K远点对(KD树)的更多相关文章

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

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

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

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

  3. BZOJ 4520: [Cqoi2016]K远点对 KDtree + 估价函数 + 堆

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 200000 #define inf 10000000000 ...

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

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

  5. 【52.55%】【BZOJ 4520】K远点对

    Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 588  Solved: 309 [Submit][Status][Discuss] Descript ...

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

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

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

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

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

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

  9. 【bzoj4520】 Cqoi2016—K远点对

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

随机推荐

  1. UNIX环境高级编程 第2章 UNIX标准及实现

    在过去的将近25年时间,人们为了UNIX的标准化做出了种种努力,这使得程序在不同版本的UNIX系统之间的移植相当容易. ISO C 1989年,C语言首个标准得到批准,其为C89.次年,一个带有小改动 ...

  2. Bresenham直线算法与画圆算法

    在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...

  3. python的新特性

    http://www.jb51.net/article/67699.htm Python中用format函数格式化字符串的用法:http://www.jb51.net/article/63672.ht ...

  4. django Rest Framework----GenericAPIView 通用视图 GenericAPIView源码分析

    一.GenericAPIView GenericAPIView扩展了APIView,为标准列表和详细视图添加了常见的行为. 提供的每个具体通用视图都是一个GenericAPIView或多个mixin类 ...

  5. python基础--xml和configparse模块

    1)XML模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多. 下面是xml的遍历查询删除修改和生成 # -*- coding:utf-8 -*- __author__ = 's ...

  6. Vue项目实现excel导出

    1.package.json里面安装三个插件 npm install  xlsx  --save npm install  script-loader  –save-dev npm install   ...

  7. 洛谷P1266速度限制

    传送门啦 看起来是一个最短路问题,但是引入了速度限制,就要写一下二维最短路了. $ dis[i][j] $ :表示到i这个点,速度为j的最短时间. #include <iostream> ...

  8. 洛谷P1491集合位置

    传送门啦 这个题说白了就是求一个次短路. 方法是我们先跑一遍最短路,记录下最短路上每一个点的前驱.然后我们将最短路上每一条边都标记一次,分别跑一边最短路,求出最短路径即可. 在这我们不用特殊判断是否是 ...

  9. sql server 2000系统表sysproperties在SQL 2008中无效的问题

    Sqlserver有一个扩展属性系统表sysproperties,因为只接触过MSSQL2005及以后的版本,在生产库2008版本及联机文档上搜了下都找不到这个系统表,后来发现这个系统表在2005版本 ...

  10. Http PipeLining

    Http PipeLining */--> div.org-src-container { font-size: 85%; font-family: monospace; } pre.src { ...