CQOI 2016 k远点对
题目大意:n个点,求第k远的点对的距离
KD树裸题
注意要用堆维护第k远
#include<bits/stdc++.h>
#define ll unsigned long long
#define maxn 100010
using namespace std;
inline int read(){
int s=;char ch=getchar();
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';ch=getchar())s=s*+ch-'';
return s;
}
int n,k,D,root;
struct node{
ll d[],mn[],mx[],ls,rs;
node(int x=,int y=){d[]=x;d[]=y;}
ll & operator [] (int x){return d[x];}
friend bool operator < (node a,node b){return a[D]<b[D];}
}a[maxn];
struct K{
ll d;
K(ll a=){d=a;}
};
priority_queue<K>Q;
bool operator < (K a,K b){return a.d>b.d;}
struct KD{
node t[maxn],T;
void up(int k){
node l=t[t[k].ls],r=t[t[k].rs];
for(int i=;i<;++i){
t[k].mn[i]=t[k].mx[i]=t[k][i];
if(t[k].ls)t[k].mn[i]=min(t[k].mn[i],l.mn[i]),t[k].mx[i]=max(t[k].mx[i],l.mx[i]);
if(t[k].rs)t[k].mn[i]=min(t[k].mn[i],r.mn[i]),t[k].mx[i]=max(t[k].mx[i],r.mx[i]);
}
}
int build(int l,int r,int now){
D=now;int mid=(l+r)>>;
nth_element(a+l,a+mid,a+r+);
t[mid]=a[mid];
if(l<mid)t[mid].ls=build(l,mid-,now^);
if(r>mid)t[mid].rs=build(mid+,r,now^);
up(mid);return mid;
}
ll dis(node a,node b){
return (a[]-b[])*(a[]-b[])+(a[]-b[])*(a[]-b[]);
}
ll get(int k){
if(!k)return ;
ll L=;
L=max(L,dis(T,node(t[k].mn[],t[k].mn[])));
L=max(L,dis(T,node(t[k].mn[],t[k].mx[])));
L=max(L,dis(T,node(t[k].mx[],t[k].mn[])));
L=max(L,dis(T,node(t[k].mx[],t[k].mx[])));
return L;
}
void ask(int k){
if(!k)return;
ll dl=get(t[k].ls),dr=get(t[k].rs);
ll L=dis(T,t[k]);
if(L>Q.top().d){Q.pop();Q.push(K(L));}
if(dl>dr){
if(dl>Q.top().d)ask(t[k].ls);
if(dr>Q.top().d)ask(t[k].rs);
}else{
if(dr>Q.top().d)ask(t[k].rs);
if(dl>Q.top().d)ask(t[k].ls);
}
}
void work(){
for(int i=;i<=n;++i){
T=a[i];
ask(root);
}
}
}kd;
int main(){
n=read();k=read();k<<=;
for(int i=;i<=n;++i)
a[i][]=read(),a[i][]=read();
root=kd.build(,n,);
for(int i=;i<=k;++i)Q.push(K());
kd.work();
cout<<Q.top().d<<endl;
return ;
}
CQOI 2016 k远点对的更多相关文章
- BZOJ4520 [Cqoi2016]K远点对
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 【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远点对
http://www.lydsy.com/JudgeOnline/problem.php?id=4520 (题目链接) 题意 求平面内第K远点对的距离. Solution 左转题解:jump 细节 刚 ...
- BZOJ 4520 [Cqoi2016]K远点对(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4520 [题目大意] 求K远点对距离 [题解] 修改估价函数为欧式上界估价,对每个点进行 ...
- BZOJ 4520: [Cqoi2016]K远点对(k-d tree)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1162 Solved: 618[Submit][Status][Discuss] Descripti ...
- 【bzoj4520】K远点对
Portal --> bzoj4520 Description 给你平面内\(n\)个点的坐标,求欧氏距离下第\(k\)远的点对 Solution 因为kd其实..严格来说挺不熟的用的太少了qw ...
- 【BZOJ4520】K远点对(KD-Tree)
[BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...
- BZOJ - 4520 K远点对
题意:已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对 维护大小为2k最小堆,KD树的估值用前面提到的做法 PS.网上有人估价是使用边界四个点的最值来独立枚举,然而这样写似乎过不了 #incl ...
随机推荐
- 常用 Git 命令
拉取远端仓库代码: 如果本地已经存在文件夹,先cd进去,然后敲命令: git fetch (作用是拉取远端仓库里的代码) git merge (作用是将远端仓库里的代码与本地仓库里的代码合并,如果有冲 ...
- SimpleXML操控XML
复杂字符串如下: $_xml=<<<_xml <?xml version="1.0" encoding="utf-8"?> < ...
- ubantu php7.0版本降级到php5.6
http://askubuntu.com/questions/756879/cant-install-php5-on-ubuntu-16-04
- windows 用默认软件打开文档
System.Diagnostics.Process.Start("Explorer.exe", string.Format("/e, \"{0}\" ...
- 浅谈redis和memcached的区别
缓存技术方面说到redis大家必然会联想到memcached,了解它们的人应该都知道以下几点吧 redis与 memcached相比,redis支持key-value数据类型,同事支持list.set ...
- postgresql 设置只读用户
postgresql 设置只读用户 ` CREATE USER readonly WITH ENCRYPTED PASSWORD 'ropass'; alter user readonly set d ...
- Microsoft Visual Studio PDB文件相关事宜
Microsoft Visual Studio PDB:调试的符号文件,程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置: 当以 /ZI 或 /Zi(用于 C/C ...
- Notepad++ 使用nppexec插件配置简易开发环境
notepad++ 采用nppexec插件来配置简易开发环境,而不需要笨重的IDE以及麻烦.重复的命令行.控制台输入: 以下为本人最近用到的脚本配置: //编程语言脚本中$(NAME_PART).x ...
- Linux系统目录结构以及简单说明
Linux系统目录结构以及简单说明 linux目录图: / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...
- ORACLE中常见SET指令
1 SET TIMING ON 说明:显示SQL语句的运行时间.默认值为OFF. 在SQLPLUS中使用,时间精确到0.01秒.也就是10毫秒. 在PL/SQL DEVELOPER 中 ...