[BZOJ4520][Cqoi2016]K远点对 kd-tree 优先队列
4520: [Cqoi2016]K远点对
Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 1285 Solved: 708
[Submit][Status][Discuss]
Description
已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对。
Input
Output
输出文件第一行为一个整数,表示第 K 远点对的距离的平方(一定是个整数)。
Sample Input
0 0
0 1
1 0
1 1
2 0
2 1
1 2
0 2
3 0
3 1
Sample Output
HINT
Source
kd-tree可以查询每个点到其他点的距离。
我们求出每两个点间的距离,随后求出第2*k大值即可。
用优先队列维护前2*k大值,在kd-tree上查询并修改即可。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#define ll long long
#define maxn 100005
using namespace std;
inline int read() {
int x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
int nowd=,rt,n,k;
struct node {ll d[],mx[],mn[],l,r;}t[maxn];
bool cmp(node t1,node t2) {return t1.d[nowd]<t2.d[nowd];}
priority_queue<ll,vector<ll>,greater<ll> >q;ll cnt=;
void pushup(int x) {
int l=t[x].l,r=t[x].r;
if(l) {
t[x].mx[]=max(t[x].mx[],t[l].mx[]);
t[x].mx[]=max(t[x].mx[],t[l].mx[]);
t[x].mn[]=min(t[x].mn[],t[l].mn[]);
t[x].mn[]=min(t[x].mn[],t[l].mn[]);
}
if(r) {
t[x].mx[]=max(t[x].mx[],t[r].mx[]);
t[x].mx[]=max(t[x].mx[],t[r].mx[]);
t[x].mn[]=min(t[x].mn[],t[r].mn[]);
t[x].mn[]=min(t[x].mn[],t[r].mn[]);
}
}
int build(int l,int r,bool D) {
int mid=l+r>>;nowd=D;
nth_element(t+l,t+mid,t+r+,cmp);
if(l<mid) t[mid].l=build(l,mid-,!D);
if(r>mid) t[mid].r=build(mid+,r,!D);
t[mid].mx[]=t[mid].mn[]=t[mid].d[];
t[mid].mx[]=t[mid].mn[]=t[mid].d[];
pushup(mid);
return mid;
}
ll dis(int x,int y) {return (t[x].d[]-t[y].d[])*(t[x].d[]-t[y].d[])+(t[x].d[]-t[y].d[])*(t[x].d[]-t[y].d[]);}
ll gdis(int x,int y) {
return max((t[x].mn[]-t[y].d[])*(t[x].mn[]-t[y].d[]),(t[x].mx[]-t[y].d[])*(t[x].mx[]-t[y].d[]))+max((t[x].mn[]-t[y].d[])*(t[x].mn[]-t[y].d[]),(t[x].mx[]-t[y].d[])*(t[x].mx[]-t[y].d[]));
}
void query(int x,int y) {
if(!x) return;
ll now=dis(x,y);
if(now>q.top()) {q.pop();q.push(now);}
ll dl=,dr=;
if(t[x].l) dl=gdis(t[x].l,y);if(t[x].r) dr=gdis(t[x].r,y);
if(dl>dr) {
if(dl>q.top()) query(t[x].l,y);
if(dr>q.top()) query(t[x].r,y);
}
else {
if(dr>q.top()) query(t[x].r,y);
if(dl>q.top()) query(t[x].l,y);
}
}
int main() {
n=read();k=read();
for(int i=;i<=n;i++) t[i].d[]=read(),t[i].d[]=read();
rt=build(,n,);
for(int i=;i<=k*;i++) q.push();
for(int i=;i<=n;i++) query(rt,i);
printf("%lld\n",q.top());
}
[BZOJ4520][Cqoi2016]K远点对 kd-tree 优先队列的更多相关文章
- BZOJ4520:[CQOI2016]K远点对(K-D Tree)
Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...
- BZOJ 4520: [Cqoi2016]K远点对(k-d tree)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1162 Solved: 618[Submit][Status][Discuss] Descripti ...
- [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/转 ...
- 【BZOJ4520】[Cqoi2016]K远点对 kd-tree+堆
[BZOJ4520][Cqoi2016]K远点对 Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 ...
- 【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】K远点对(KD-Tree)
[BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...
- [Cqoi2016]K远点对 K-Dtree
4520: [Cqoi2016]K远点对 链接 bzoj 思路 用K-Dtree求点的最远距离. 求的时候顺便维护一个大小为2k的小根堆. 不知道为啥一定会对. 代码 #include <bit ...
随机推荐
- mysql 5.7 Access denied for user 'root'@'localhost' solution
sudo vim /etc/mysql/debian.cnf # Automatically generated for Debian scripts. DO NOT TOUCH! [client] ...
- MySQL密码忘了怎么办
之前在ubuntu 12.04里安装了xampp,设置了mysql数据库root密码,今天需要增加个数据库,发现忘记之前设置的密码是什么了.经过一番摸爬滚打,终于搞明白了,注意以下的操作都是以linu ...
- Win10上部署Apollo配置中心
基于Docker在Win10上部署Apollo配置中心 https://www.jianshu.com/p/a1215056ce75 http://nobodyiam.com/2016/07/09/i ...
- 【bzoj4724】[POI2017]Podzielno 二分
题目描述 B进制数,每个数字i(i=0,1,...,B-1)有a[i]个.你要用这些数字组成一个最大的B进制数X(不能有前导零,不需要用完所有数字),使得X是B-1的倍数.q次询问,每次询问X在B进制 ...
- SRM710 div1 MagicNim(博弈论)
题目大意: 给出n+1堆石子,前n堆石子的数量是a[i],最后一堆只有1个石子,但是具有魔力 拿走该石子的一方可以选择接下来是进行普通的Nim游戏还是anti-nim游戏 问是先手必胜还是必败 首先拿 ...
- 【电影影评】梦之安魂曲-败给了BGM和豆瓣影评
首先,这部电影豆瓣8.7分,一般来说,豆瓣的打分是比较准确的.能反映一个片子的质量,而较少受到环境的影响.但是这种关系当然也不全对,比如某些片子可能特别让某一种人喜欢(如退役军人和军旅题材),而在某些 ...
- Visio中ShapeAdded和SelectionAdded
SelectionAdded 和 ShapeAdded 事件的相似之处在于它们都在创建形状之后触发.它们的区别在于,当单个操作添加多个形状时它们的行为方式不同.假定一个 Paste 操作创建三个新建形 ...
- 【bzoj2756 奇怪的游戏】
Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 4403 Solved: 1226[Submit][Status][Discuss] Descript ...
- 压缩跟踪Compressive Tracking
好了,学习了解了稀疏感知的理论知识后,终于可以来学习<Real-Time Compressive Tracking>这个paper介绍的感知跟踪算法了.自己英文水平有限,理解难免出错,还望 ...
- java中 快捷键输入System.out.println();
syso 然后:alt+ /(就是问号键)