[CQOI2016]K远点对(KD-Tree)
2024-10-08 17:07:45
暴力的做法应该是这样的,维护大小为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());
}
最新文章
- VS2013全攻略
- ReactNative新手学习之路05 使用夜神模拟器调试ReactNative
- Charles
- IE 浏览器 如何关闭令人讨厌的“此网站需要运行以下加载项:XXX。如果您信任该网站和该加载项并允许运行该加载项,请单击这里...
- Android 常用数据适配器ArrayAdapter
- SCOM Visio监控 与sharepoint 2010 整合
- C++里的静态成员函数不能用const的原因
- Vue.js之初印象
- HW--自守数
- android 自定义gallerey并实现预览功能
- IDEA项目的复制操作
- Ajax 异步局部刷新
- WRT 下 C++ wstring, string, String^ 互转
- CentOS最小化安装(一)
- day05今日学习总结:字符串类型
- 对 JavaScript 下 namespace 功能的简单分析
- Android 开发服务类 02_NewsListServlet
- Ubuntu pydot failed to call GraphViz.Please install GraphViz 解决方法
- linux 版本查询
- 【翻译】Django Channels 官方文档 -- Tutorial