BZOJ4520 CQOI2016K远点对(KD-Tree+堆)
堆维护第k大,每个点KD-Tree上A*式查询较远点,跑得飞快,复杂度玄学。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,c,root,cnt;
struct point
{
int d[];
bool operator <(const point&a) const
{
return d[c]<a.d[c];
}
}a[N];
struct KDTree{int ch[],a[][];point p;
}tree[N];
priority_queue<ll,vector<ll>,greater<ll> > q;
ll sqr(int x){return 1ll*x*x;}
ll dis(point u,point v){return sqr(u.d[]-v.d[])+sqr(u.d[]-v.d[]);}
ll dis(point u,int a[][]){return sqr(max(u.d[]-a[][],a[][]-u.d[]))+sqr(max(u.d[]-a[][],a[][]-u.d[]));}
void build(int &k,int l,int r,int op)
{
if (l>r) return;
k=++cnt,c=op;int mid=l+r>>;nth_element(a+l,a+mid,a+r+);
tree[k].p=a[mid];tree[k].a[][]=tree[k].a[][]=a[mid].d[],tree[k].a[][]=tree[k].a[][]=a[mid].d[];
for (int i=l;i<=r;i++)
tree[k].a[][]=min(tree[k].a[][],a[i].d[]),tree[k].a[][]=max(tree[k].a[][],a[i].d[]),
tree[k].a[][]=min(tree[k].a[][],a[i].d[]),tree[k].a[][]=max(tree[k].a[][],a[i].d[]);
build(tree[k].ch[],l,mid-,op^);
build(tree[k].ch[],mid+,r,op^);
}
void query(int k,point p)
{
if (dis(tree[k].p,p)>=q.top()) q.push(dis(tree[k].p,p)),q.pop();
int l=tree[k].ch[],r=tree[k].ch[];ll u=dis(p,tree[l].a),v=dis(p,tree[r].a);
if (u<v) swap(l,r),swap(u,v);
if (l&&u>=q.top()) query(l,p);
if (r&&v>=q.top()) query(r,p);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4520.in","r",stdin);
freopen("bzoj4520.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read()<<;
for (int i=;i<=n;i++) a[i].d[]=read(),a[i].d[]=read();
build(root,,n,);
while (m--) q.push();
for (int i=;i<=n;i++) query(root,a[i]);
cout<<q.top();
return ;
}
BZOJ4520 CQOI2016K远点对(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 ...
- K-D Tree题目泛做(CXJ第二轮)
题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- [学习笔记]K-D Tree
以前其实学过的但是不会拍扁重构--所以这几天学了一下 \(K-D\ Tree\) 的正确打开姿势. \(K\) 维 \(K-D\ Tree\) 的单次操作最坏时间复杂度为 \(O(k\times n^ ...
- 初涉k-d tree
听说k-d tree是一个骗分的好东西?(但是复杂度差评??? 还听说绍一的kdt常数特别小? KDT是什么 KDT的全称是k-degree tree,顾名思义,这是一种处理多维空间的数据结构. 例如 ...
- BZOJ1941:[SDOI2010]Hide and Seek(K-D Tree)
Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏- ...
- BZOJ 3053: The Closest M Points(K-D Tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1235 Solved: 418[Submit][Status][Discuss] Descripti ...
- BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)
Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 1712 Solved: 932[Submit][Status][Discuss] Descripti ...
随机推荐
- ansible role 理解
1.roles意为角色,主要用于封装playbook实现复用性.在ansible中,roles通过文件的组织结构来展现.
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为 ...
- 20155229《网络对抗技术》Exp5:MSF基础应用
实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个主动攻击实践,如ms08-067; 一个针对浏览器的攻击,如ms11-050: 一个针对 ...
- Luogu P4322 [JSOI2016]最佳团体
JZdalao昨天上课讲的题目,话说JSOI的题目是真的不难,ZJOI的题目真的是虐啊! 题意很简单,抽象一下就是:有一棵树,一次只能选从根到某个节点上的链上的所有点,问从中取出k个节点所得到的总价值 ...
- 汇编 浮点指令FLD,FSTP,FADD与FPU寄存器
知识点: 浮点数的存放方式 st0至st7 FLD,FST,FADD指令 一.浮点数的存放方式 00401000 /$ 55 PUSH EBP 00401001 |. 8BEC MOV E ...
- JVM技术周报第1期
JVM技术周报 · 第1期 JVM技术每周分享整理了JVM技术交流群每周讨论的内容,由群内成员整理归纳而成.如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友, ...
- android 一些常用的功能方法代码块
我们这些苦逼的程序员在工作中,每一个老板都希望我们都能把手头的工作做好的,而且是越快越好,那我们要怎么样才能快起来呢?对于开发中常用的代码块无限复做是我们工作中简省时间最有效的途径之一,而下面的这些代 ...
- Js_图片切换左右点击
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...
- nodejs 监控代码变动实现ftp上传
被动模式下 //https://www.npmjs.com/package/watch //文件同步功能 var watch = require('watch'); var path = requir ...
- 如何自出版一本书:定制 bookdown
目录 如何自出版一本书:定制 bookdown bookdown 的第一步 亚马逊 Kindle 格式 创建书籍 _bookdown.yml 注意行宽 写在每个 .Rmd 文件的开头 index.Rm ...