[bzoj4520][Cqoi2016]K远点对_KD-Tree_堆
K远点对 bzoj-4520 Cqoi-2016
题目大意:已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对。
注释:$1\le n\le 10^5$,$1\le k\le 100$,$k\le n*(n-1)/2$,$0\le x,y<2^{31}$。
想法:
KD-Tree还是很暴力的。
我们只需要考虑直接暴力的维护一个个数为$k$的堆即可。
复杂度什么的都滚蛋吧,反正能过。
Code:
#include <bits/stdc++.h>
#define inf 10000000000000000ll
#define N 100010
using namespace std; typedef long long ll;
char *p1,*p2,buf[100000]; int d,root;
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
priority_queue<ll,vector<ll>,greater<ll> >q;
struct Node {int p[2],ls,rs,mn[2],mx[2];}a[N];
inline bool cmp(const Node &a,const Node &b) {return a.p[d]==b.p[d]?a.p[d^1]<b.p[d^1]:a.p[d]<b.p[d];}
template <typename T> void Max(T &x,T y) {x=max(x,y);}
template <typename T> void Min(T &x,T y) {x=min(x,y);}
inline void pushup(int x,int k)
{
Max(a[x].mx[0],a[k].mx[0]); Max(a[x].mx[1],a[k].mx[1]);
Min(a[x].mn[0],a[k].mn[0]); Min(a[x].mn[1],a[k].mn[1]);
}
int build(int l,int r,int now)
{
int mid=(l+r)>>1;
d=now; nth_element(a+l,a+mid,a+r+1,cmp);
a[mid].mn[0]=a[mid].mx[0]=a[mid].p[0];
a[mid].mn[1]=a[mid].mx[1]=a[mid].p[1];
if(l<mid) a[mid].ls=build(l,mid-1,now^1),pushup(mid,a[mid].ls);
if(mid<r) a[mid].rs=build(mid+1,r,now^1),pushup(mid,a[mid].rs);
return mid;
}
inline ll sqr(ll x) {return x*x;}
inline ll getdis(int x,int p0,int p1) {return sqr(max(abs(p0-a[x].mx[0]),abs(p0-a[x].mn[0])))+sqr(max(abs(p1-a[x].mn[1]),abs(p1-a[x].mx[1])));}
void query(int x,int k)
{
int ls=a[x].ls,rs=a[x].rs; ll dl,dr;
dl=ls?getdis(ls,a[k].p[0],a[k].p[1]):-inf;
dr=rs?getdis(rs,a[k].p[0],a[k].p[1]):-inf;
ll dis=sqr(a[k].p[0]-a[x].p[0])+sqr(a[k].p[1]-a[x].p[1]);
if(dis>q.top()&&x!=k) q.pop(),q.push(dis);
if(dl>dr)
{
if(dl>q.top()) query(ls,k);
if(dr>q.top()) query(rs,k);
}
else
{
if(dr>q.top()) query(rs,k);
if(dl>q.top()) query(ls,k);
}
}
int main()
{
int n=rd(),m=rd(); m*=2;
for(int i=1;i<=n;i++) a[i].p[0]=rd(),a[i].p[1]=rd();
root=build(1,n,0);
for(int i=1;i<=m;i++) q.push(0);
for(int i=1;i<=n;i++) query(root,i);
cout << q.top() << endl ;
return 0;
}
小结:好题。
[bzoj4520][Cqoi2016]K远点对_KD-Tree_堆的更多相关文章
- [BZOJ4520][Cqoi2016]K远点对 kd-tree 优先队列
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1285 Solved: 708[Submit][Statu ...
- BZOJ4520 [Cqoi2016]K远点对
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ4520:[CQOI2016]K远点对(K-D Tree)
Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...
- 【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 ...
- 【bzoj4520】 Cqoi2016—K远点对
http://www.lydsy.com/JudgeOnline/problem.php?id=4520 (题目链接) 题意 求平面内第K远点对的距离. Solution 左转题解:jump 细节 刚 ...
随机推荐
- Swift 基础语法入门(一)
一.变量和常量 1.声明常量和变量 用let来声明常量 let radius = 10 用var来声明变量 var age = 20 或者是var x = 0.0, y = 0.0, z = 0 ...
- InChatter系统之客户端实现原理与阶段小结
InChatter客户端的开发可以说是目前系统的阶段性结尾了.很抱歉的是,这篇文章来的这么晚,迟到了这么久. 在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理 一.消息的传输与处 ...
- raw cannot be resolved or is not a field解决办法
解决raw文件夹问题 查看左侧项目/res文件夹下是否有raw文件夹,(一定是放到res文件夹下,raw在项目开始创建时候不会自动创建,所以要自己创建)
- 按键精灵txt判断
句子 = "度阿斯达娘阿婶是大的百度知道" 词 = "百度知道" MyPos = Instr(句子, 词) If MyPos > 0 Then Tra ...
- MATLAB 中的randn函数
matlab函数 randn:产生正态分布的随机数或矩阵的函数 randn:产生均值为0,方差σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数. 用法: Y = randn(n):返回一 ...
- iTOP-4418/6818开发板支持锂电池供电方案
iTOP-4418/6818开发板支持的是官方推荐的AXP228电池管理,动态调频,更稳定可靠,支持充放电电路与电量计(库化计), 广泛应用于各种电子产品中. 4418开发板中锂电池充放电接口,适用于 ...
- RackTables在LNMP系统的安装及使用
RackTables是一款优秀的机房管理系统,可以十分方便的登记机房设备和连接情况,非常适合小型机房的运维.RackTables是PHP开发的免费系统,最新版本为0.20.14,PHP版本要求不低于P ...
- MFC程序最小化到系统托盘及其响应函数
预备知识: Windows API函数: WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid ...
- 【软件构造】(转)Java中的comparable和comparator
为了方便阅读和复习,转载至此,原地址:温布利往事的博客 阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Co ...
- 19Web服务
Web服务 Web服务 Micosoft.Net平台架构中的分布式系统主要包括两部分:用ASP.Net技术构建服务器端动态网页,以及Web服务(Web Service或XML Web Service) ...