暴力的做法应该是这样的,维护大小为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());
}

最新文章

  1. VS2013全攻略
  2. ReactNative新手学习之路05 使用夜神模拟器调试ReactNative
  3. Charles
  4. IE 浏览器 如何关闭令人讨厌的“此网站需要运行以下加载项:XXX。如果您信任该网站和该加载项并允许运行该加载项,请单击这里...
  5. Android 常用数据适配器ArrayAdapter
  6. SCOM Visio监控 与sharepoint 2010 整合
  7. C++里的静态成员函数不能用const的原因
  8. Vue.js之初印象
  9. HW--自守数
  10. android 自定义gallerey并实现预览功能
  11. IDEA项目的复制操作
  12. Ajax 异步局部刷新
  13. WRT 下 C++ wstring, string, String^ 互转
  14. CentOS最小化安装(一)
  15. day05今日学习总结:字符串类型
  16. 对 JavaScript 下 namespace 功能的简单分析
  17. Android 开发服务类 02_NewsListServlet
  18. Ubuntu pydot failed to call GraphViz.Please install GraphViz 解决方法
  19. linux 版本查询
  20. 【翻译】Django Channels 官方文档 -- Tutorial

热门文章

  1. 洛谷 P2725 邮票 Stamps
  2. 046、Java中使用if…else判断
  3. 自己写个tween
  4. Linux添加虚拟内存 &amp;&amp; 修改Linux系统语言
  5. SSM文件上传要点总结
  6. 指令——rm
  7. Web系统测试的常用方法总结-18《转载》
  8. JavaWeb学习——了解HTML
  9. js加密(十三)zzxt.hee.gov.cn md5
  10. 【数据结构】C++语言无锁环形队列的实现