P4357 [CQOI2016]K远点对(KDTree)
又一次产生了KDTree本质就是爆搜的感觉……
大概就类似于p4169,只不过是从最近点对变成了第\(k\)远点对
我们开一个小根堆,里面放\(k\)个元素,起初全为\(0\),然后每一次都把点对的距离和堆顶比较,如果点对距离大于就弹出堆顶并让这个点对入堆,那么最后堆顶就是答案了
于是我们可以枚举每一个点,然后在KDTree上dfs就行了
然后因为每个点对会被枚举两次,所以小根堆的大小实际上要开\(2*k\)
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
R ll res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1e5+5;
struct node{ll v[2],mn[2],mx[2];int l,r;}tr[N],S;
int n,m,K,rt;priority_queue<ll,vector<ll>,greater<ll> >q;
inline bool operator <(const node &a,const node &b){return a.v[K]<b.v[K];}
void upd(int p){
int l=tr[p].l,r=tr[p].r;
fp(i,0,1){
tr[p].mn[i]=tr[p].mx[i]=tr[p].v[i];
if(l)cmin(tr[p].mn[i],tr[l].mn[i]),cmax(tr[p].mx[i],tr[l].mx[i]);
if(r)cmin(tr[p].mn[i],tr[r].mn[i]),cmax(tr[p].mx[i],tr[r].mx[i]);
}
}
int build(int l,int r,int k){
K=k;int mid=(l+r)>>1;nth_element(tr+l,tr+mid,tr+r+1);
if(l<mid)tr[mid].l=build(l,mid-1,k^1);
if(mid<r)tr[mid].r=build(mid+1,r,k^1);
upd(mid);return mid;
}
inline ll sqr(ll x){return x*x;}
inline ll ck(ll x,ll y,int p){
return max(sqr(tr[p].mn[0]-x),sqr(tr[p].mx[0]-x))+max(sqr(tr[p].mn[1]-y),sqr(tr[p].mx[1]-y));
}
inline ll dis(ll x,ll y,ll xx,ll yy){
return sqr(x-xx)+sqr(y-yy);
}
void query(int p){
ll dl=-inf,dr=-inf,dd=dis(tr[p].v[0],tr[p].v[1],S.v[0],S.v[1]);
if(tr[p].l)dl=ck(S.v[0],S.v[1],tr[p].l);
if(tr[p].r)dr=ck(S.v[0],S.v[1],tr[p].r);
if(dd>q.top())q.pop(),q.push(dd);
if(dl>dr){
if(dl>q.top())query(tr[p].l);
if(dr>q.top())query(tr[p].r);
}else{
if(dr>q.top())query(tr[p].r);
if(dl>q.top())query(tr[p].l);
}
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read();fp(i,1,n)tr[i].v[0]=read(),tr[i].v[1]=read();
rt=build(1,n,0);fp(i,1,m*2)q.push(0);
fp(i,1,n)S.v[0]=tr[i].v[0],S.v[1]=tr[i].v[1],query(rt);
printf("%lld\n",q.top());return 0;
}
P4357 [CQOI2016]K远点对(KDTree)的更多相关文章
- [BZOJ4520][Cqoi2016]K远点对 kd-tree 优先队列
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1285 Solved: 708[Submit][Statu ...
- 【BZOJ4520】[Cqoi2016]K远点对 kd-tree+堆
[BZOJ4520][Cqoi2016]K远点对 Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 ...
- [Cqoi2016]K远点对 K-Dtree
4520: [Cqoi2016]K远点对 链接 bzoj 思路 用K-Dtree求点的最远距离. 求的时候顺便维护一个大小为2k的小根堆. 不知道为啥一定会对. 代码 #include <bit ...
- P4357 [CQOI2016]K远点对
题意:给定平面中的 \(n\) 个点,求第 \(K\) 远的点对之间的距离,\(n\leq 1e5,K\leq min(100,\frac{n\times (n-1)}{2})\) 题解:kd-tre ...
- BZOJ 4520: [Cqoi2016]K远点对 KDtree + 估价函数 + 堆
Code: #include<bits/stdc++.h> #define ll long long #define maxn 200000 #define inf 10000000000 ...
- 【BZOJ-4520】K远点对 KD-Tree + 堆
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 490 Solved: 237[Submit][Status ...
- BZOJ 4520: [Cqoi2016]K远点对
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 638 Solved: 340[Submit][Status ...
- [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 ...
- BZOJ4520 [Cqoi2016]K远点对
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
随机推荐
- [Bzoj5177][Jsoi2013]贪心的导游(主席树)
5177: [Jsoi2013]贪心的导游 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 32 Solved: 15[Submit][Status] ...
- [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)
4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 629 Solved: 371[Submit][Status ...
- git服务端安装
Windows平台下Git服务器搭建 第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 注意要下载是完整的JDK(其中有jre) 第二步:安装Java.安装步骤不 ...
- 【python】SHA1 算法
http://blog.163.com/sh_wenfen/blog/static/99708242007231103936938/
- mutex 的 可重入
在所有的线程同步方法中,恐怕互斥锁(mutex)的出场率远远高于其它方法.互斥锁的理解和基本使用方法都很容易,这里不做更多介绍了. Mutex可以分为递归锁(recursive mutex)和非递归锁 ...
- 精通CSS:高级Web标准解决方式(第2版)
精通CSS:高级Web标准解决方式(第2版) 跳转至: 导航. 搜索 层叠重要度:(也就是说.用户!important能够覆盖inline style) !important.用户>作者.最后是 ...
- Kemans算法及其Python 实现
算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就 ...
- js 二维码
https://larsjung.de/jquery-qrcode/ 源码 <!DOCTYPE html> <html> <head> <title>j ...
- web 开发之js---ajax 中的两种提交方式ajax post 和 ajax get 实例
()post http://04101334.iteye.com/blog/637695/ ()get function serializeElement(element) { var method ...
- 【iOS系列】-iOS开发,GET,POST请求使用
[iOS系列]-iOS开发,GET,POST请求使用 步骤: 1:实例化URL(网络资源) 2:根据URL建立URLRequest(网络请求) 默认为GET请求: 对于POST请求,需要创建请求的数据 ...