Description

已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对。

Input

输入文件第一行为用空格隔开的两个整数 N, K。接下来 N 行,每行两个整数 X,Y,表示一个点
的坐标。1 < =  N < =  100000, 1 < =  K < =  100, K < =  N*(N−1)/2 , 0 < =  X, Y < 2^31。

Output

输出文件第一行为一个整数,表示第 K 远点对的距离的平方(一定是个整数)。

Sample Input

10 5
0 0
0 1
1 0
1 1
2 0
2 1
1 2
0 2
3 0
3 1

Sample Output

9

Solution

到现在为止只会写K-D Tree的板子题……
这次画了个图又理解了一下估价函数,感觉挺不错的
按照套路维护k远开个堆就好了,只不过由于这个题(x,y)和(y,x)算一对
需要开2*k的堆最后输出堆顶

Code

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#include<algorithm>
#define N (100000+1000)
#define INF 1e17
using namespace std; struct P
{
long long dis,num;
bool operator < (const P &a) const{return dis>a.dis;}
}po;
long long n,k,D,Root;
priority_queue<P>q; struct Node
{
long long d[],Max[],Min[],lson,rson;
bool operator < (const Node &a) const {return d[D]<a.d[D];}
}p[N],T; struct KDT
{
Node Tree[N];
long long sqr(long long x){return x*x;} void Update(long long now)
{
for (int i=; i<=; ++i)
{
long long ls=Tree[now].lson, rs=Tree[now].rson;
Tree[now].Max[i]=Tree[now].Min[i]=Tree[now].d[i];
if (ls)
{
Tree[now].Max[i]=max(Tree[now].Max[i],Tree[ls].Max[i]);
Tree[now].Min[i]=min(Tree[now].Min[i],Tree[ls].Min[i]);
}
if (rs)
{
Tree[now].Max[i]=max(Tree[now].Max[i],Tree[rs].Max[i]);
Tree[now].Min[i]=min(Tree[now].Min[i],Tree[rs].Min[i]);
}
}
}
long long Build(long long opt,long long l,long long r)
{
if (l>r) return ;
long long mid=(l+r)>>;
D=opt; nth_element(p+l,p+mid,p+r+);
Tree[mid]=p[mid];
Tree[mid].lson=Build(opt^,l,mid-);
Tree[mid].rson=Build(opt^,mid+,r);
Update(mid); return mid;
}
long long Get_max(long long now)
{
long long ans=;
for (int i=; i<=; ++i)
ans+=max(sqr(T.d[i]-Tree[now].Min[i]),sqr(T.d[i]-Tree[now].Max[i]));
return ans;
}
void Query(long long now)
{
long long ls=Tree[now].lson, rs=Tree[now].rson, lans=-INF, rans=-INF;
if (ls) lans=Get_max(ls);
if (rs) rans=Get_max(rs); po.dis=sqr(T.d[]-Tree[now].d[])+sqr(T.d[]-Tree[now].d[]); po.num=now;
if (po.dis>q.top().dis)
q.pop(),q.push(po); if (lans>rans)
{
if (lans>q.top().dis) Query(ls);
if (rans>q.top().dis) Query(rs);
}
else
{
if (rans>q.top().dis) Query(rs);
if (lans>q.top().dis) Query(ls);
}
}
}KDT; int main()
{
scanf("%lld%lld",&n,&k);
for (int i=; i<=n; ++i)
scanf("%lld%lld",&p[i].d[],&p[i].d[]);
Root=KDT.Build(,,n); po.dis=-INF,po.num=;
for (int i=; i<=*k; ++i)
q.push(po); for (int i=; i<=n; ++i)
{
T=KDT.Tree[i];
KDT.Query(Root);
}
printf("%lld",q.top().dis);
}

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

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

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

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

  3. 【bzoj4520】 Cqoi2016—K远点对

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

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

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

  5. BZOJ4520 [Cqoi2016]K远点对

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

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

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

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

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

  8. 【bzoj4520】K远点对

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

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

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

随机推荐

  1. OPENROWSET read excel

    由于64位系统已经不支持 oledb 4.0访问 xls 1. 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序 去http://download.microsoft. ...

  2. Yii1 的数据库操作整理

    1.根据条件查询一个集合 $objectResult=Post::model()->findAll($condition,$params);$objectResult=Post::model() ...

  3. zabbix 报警程序

    一,报警程序 本次使用的为onealert http://c.onealert.com/console/ucid/login.jsp 二,服务端安转 下面为他教的怎么安装这个东西 第一步: 找到脚本目 ...

  4. CAD 卸载工具,完美彻底清除干净cad各种残留注册表和文件

    是不是遇到MAYA/CAD/3DSMAX/INVENTOR安装失败?AUTODESK系列软件着实令人头疼,MAYA/CAD/3DSMAX/INVENTOR安装失败之后不能完全卸载!!!(比如maya, ...

  5. vue-scroller的使用 && 开发自己的 scroll 插件

    vue-scroller的使用 在spa开发过程中,难免会遇到使用scroll的情况,比如下面的: 即,当用户选择好商品之后,点击购物车,就会有一个购物车弹窗,如果选择的商品小于三个,刚好合适,如果多 ...

  6. Maven工程红色感叹号,且工程无红叉错误

    很可能是jar包不对,可以将maven库里的jar包删除,从 http://mvnrepository.com/ 根据jar包版本号下载到本地maven库,并在pom.xml里引入jar依赖 这次ja ...

  7. pat1006. Sign In and Sign Out (25)

    1006. Sign In and Sign Out (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  8. vim创建新的命令

    转自:http://man.chinaunix.net/newsoft/vi/doc/usr_5F40.html#usr_40.txt *40.1* 键映射 简单的映射已经在 |05.3| 介绍过了. ...

  9. Hadoop 2.7.2 集群搭建(转载)

    http://blog.csdn.net/u010048823/article/details/51913608

  10. C# ADO.NET 面向对象

    ADO.NET跟面向对象的结合 把面向对象跟数据库连接用 在项目里面创建一个新的文件夹   名字为App_Code 在这个App_Code里面创建几个类 主要为拆分问题,标上序号,先干什么在干什么 实 ...