4520: [Cqoi2016]K远点对

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 1285  Solved: 708
[Submit][Status][Discuss]

Description

已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对。

 

Input

输入文件第一行为用空格隔开的两个整数 N, K。接下来 N 行,每行两个整数 X,Y,表示一个点
的坐标。1 < =  N < =  100000, 1 < =  K < =  100, K < =  N*(N−1)/2 , 0 < =  X, Y < 2^31。
 

Output

输出文件第一行为一个整数,表示第 K 远点对的距离的平方(一定是个整数)。

 

Sample Input

10 5
0 0
0 1
1 0
1 1
2 0
2 1
1 2
0 2
3 0
3 1

Sample Output

9

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 优先队列的更多相关文章

  1. BZOJ4520:[CQOI2016]K远点对(K-D Tree)

    Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...

  2. BZOJ 4520: [Cqoi2016]K远点对(k-d tree)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1162  Solved: 618[Submit][Status][Discuss] Descripti ...

  3. [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 ...

  4. BZOJ4520 [Cqoi2016]K远点对

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  5. 【BZOJ4520】[Cqoi2016]K远点对 kd-tree+堆

    [BZOJ4520][Cqoi2016]K远点对 Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 ...

  6. 【BZOJ-4520】K远点对 KD-Tree + 堆

    4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 490  Solved: 237[Submit][Status ...

  7. BZOJ 4520: [Cqoi2016]K远点对

    4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 638  Solved: 340[Submit][Status ...

  8. 【BZOJ4520】K远点对(KD-Tree)

    [BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...

  9. [Cqoi2016]K远点对 K-Dtree

    4520: [Cqoi2016]K远点对 链接 bzoj 思路 用K-Dtree求点的最远距离. 求的时候顺便维护一个大小为2k的小根堆. 不知道为啥一定会对. 代码 #include <bit ...

随机推荐

  1. window下对samba的清理操作

    windows清除访问samba局域网密码缓存 1.在dos窗口中输入control userpasswords2或者control keymgr.dll,然后[高级]/[密码管理],删掉保存的该机器 ...

  2. 【python】实现一个python编程的小时钟!

    [本实验内容] 1.GUI.PyQT5介绍2.实现此次实验效果 [一 GUI.PyQt5介绍] 1.Python简介 2.GUI介绍 几个常用的Python GUI库: (1)wxPython (2) ...

  3. [剑指Offer] 16.合并两个排序链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. [思路1]递归 /* struct ListNode { int val; struct Lis ...

  4. CF115B Lawnmower

    题目描述 You have a garden consisting entirely of grass and weeds. Your garden is described by an n×mn×m ...

  5. Codeforces 662C(快速沃尔什变换 FWT)

    感觉快速沃尔什变换和快速傅里叶变换有很大的区别啊orz 不是很明白为什么位运算也可以叫做卷积(或许不应该叫卷积吧) 我是看 http://blog.csdn.net/liangzhaoyang1/ar ...

  6. 【NOIP模拟赛】beautiful 乱搞(平衡树)+ST

    biubiu~~~ 我用平衡树处理的这道题,然而这种方法还是要看评测姬..... 正解是乱搞....就是枚举每一位数作为中位数,比他小的看做-1比他大的看做1,那么我们从一开始就有了一个绵延的山,我们 ...

  7. angularjs的验证信息的写法

    <div ng-messages="alarmDelayForm.alarmRuleName.$error" role="alert"> <d ...

  8. CSS中的text-shadow。

    text-shadow(文字投影),box-shadow(容器投影),border-radius(圆角)这三个属性估计以后用的比较多,记录 一下.目前不支持IE系列(不过可以使用其他方法实现,下文有详 ...

  9. 斯特林数(Stirling number)

    在组合数学,Stirling 数可指两类数,第一类Stirling 数和第二类 Stirling 数,都是由18世纪数学家 James Stirling 提出的. Stirling 数有两种,第一类和 ...

  10. 【洛谷 P2346】四子连棋(状态压缩,搜索)

    其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...