Overview

给出平面上两两不重合的$n$个整点, 求每个点到它在其他$n-1$个点的最近临点的欧几里得距离的平方.

Solution

k-d tree 模板题.

关于k-d tree, 见这篇博客.

Implementation

#include <bits/stdc++.h>
#define lson id<<1
#define rson id<<1|1
#define sqr(x) (x)*(x)
using namespace std;
using LL=long long;
const int N=1e5+5; // K-D tree: a special case of binary space partitioning trees
int DIM=2, idx; struct Node{
LL key[2];
bool operator<(const Node &rhs)const{
return key[idx]<rhs.key[idx];
}
void read(){
for(int i=0; i<DIM; i++)
scanf("%lld", key+i);
}
LL dis2(const Node &rhs)const{
LL res=0;
for(int i=0; i<DIM; i++)
res+=sqr(key[i]-rhs.key[i]);
return res;
}
}p[N], _p[N]; Node a[N<<2]; // K-D tree
bool f[N<<2]; // [l, r)
void build(int id, int l, int r, int dep){
if(l==r) return; // error-prone
f[id]=true, f[lson]=f[rson]=false;
// select axis based on depth so that axis cycles through all valid values
idx=dep%DIM;
int mid=l+r>>1;
// sort point list and choose median as pivot element
nth_element(p+l, p+mid, p+r);
a[id]=p[mid];
build(lson, l, mid, dep+1);
build(rson, mid+1, r, dep+1);
} LL mi; void query(const Node &p, int id, int dep){
int dim=dep%DIM;
int x=lson, y=rson;
// left: <, right >=
if(p.key[dim]>=a[id].key[dim])
swap(x, y); if(f[x]) query(p, x, dep+1);
LL cur=p.dis2(a[id]);
if(cur && cur<mi) mi=cur; if(f[y] && sqr(a[id].key[dim]-p.key[dim])<mi)
query(p, y, dep+1);
} int main(){
int T;
scanf("%d", &T);
for(int n; T--; ){
scanf("%d", &n);
for(int i=0; i<n; i++){
p[i].read();
_p[i]=p[i]; //error-prone
}
build(1, 0, n, 0);
for(int i=0; i<n; i++){
mi=LLONG_MAX;
query(_p[i], 1, 0); //error-prone
printf("%lld\n", mi);
}
}
return 0;
}

HDU #2966 In case of failure的更多相关文章

  1. hdu 2966 In case of failure k-d树

    题目链接 给n个点, 求出每个点到离它最近的点的距离. 直接建k-d树然后查询就可以  感觉十分神奇... 明白了算法原理但是感觉代码还不是很懂... #include <bits/stdc++ ...

  2. 【HDOJ】2966 In case of failure

    KD树,这东西其实在ML经常被使用,不过30s的时限还是第一次见. /* 2966 */ #include <iostream> #include <string> #incl ...

  3. In case of failure

    In case of failure http://acm.hdu.edu.cn/showproblem.php?pid=2966 Time Limit: 60000/30000 MS (Java/O ...

  4. 【 HDU2966 】In case of failure(KD-Tree)

    BUPT2017 wintertraining(15) #5E HDU - 2966 题意 给平面直角坐标系下的n个点的坐标,求离每个点和它最近点的距离的平方.\(2 \le n \le 10^5\) ...

  5. kd树 hdu2966 In case of failure

    传送门:pid=2966" target="_blank">点击打开链接 题意:给n个点,求对于每一个点到近期点的欧几里德距离的平方. 思路:看鸟神博客学kd树劲啊 ...

  6. 【HDU 2966 k-dimensional Tree 入个门】

    ·“k-d树是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的范围搜索和最近邻搜索……”’'   ·英文题,述大意:      给出平面内n个点(n<=100000,0<=x, ...

  7. HDU2966 In case of failure(浅谈k-d tree)

    嘟嘟嘟 题意:给定\(n\)个二维平面上的点\((x_i, y_i)\),求离每一个点最近的点得距离的平方.(\(n \leqslant 1e5\)) 这就是k-d tree入门题了. k-d tre ...

  8. K-D树

    一般用来解决各种二维平面的点对统计,也许一般非正解? 没时间慢慢写了,打完这个赛季后补细节 建树板子: #include <cstdio> #include <locale> ...

  9. Scala For Java的一些参考

          变量 String yourPast = "Good Java Programmer"; val yourPast : String = "Good Java ...

随机推荐

  1. 制作stick侧边栏导航效果

    其实这种效果网上好多的插件,但是我想自己实现看看,其实把思路理清实现起来就非常简单了,让我们看看: 分析: 从图中我们可以看出:右边的top=100px,那么它应该在第一个框的top+height=1 ...

  2. 关于BOM

    BOM:浏览器对象模型 (Browser Object Model)主要定义的是JS操作浏览器的方法和属性. 大部分方法都在window下. 常用方法:(JS里面规定如果方法前面是window,win ...

  3. HBase配置项详解

    hbase.tmp.dir:本地文件系统的临时目录,默认是java.io.tmpdir/hbase−java.io.tmpdir/hbase−{user.name}: hbase.rootdir:hb ...

  4. doc2vec使用说明(一)gensim工具包TaggedLineDocument

    gensim 是处理文本的很强大的工具包,基于python环境下: 1.gensim可以做什么? 它可以完成的任务,参加gensim 主页API中给出的介绍,链接如下: http://radimreh ...

  5. JavaScript学习笔记-简单的计时钟表

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  6. Form表单提交的简要方式

    <html> <head> <meta name="viewport" content="width=device-width" ...

  7. java swing模仿随机频谱

    import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Grap ...

  8. PotPlayer为播放而生的专业播放器

    韩国,比较牛逼的视频播放器.专注与本地视频播放,值得拥有.... 免费下载:http://yunpan.cn/cmZ5ELC6DTI8Y  访问密码 4bf1

  9. tab切换(修改)

    html代码: <div class="tabContent"> <ul class="tab clearFix"> <li cl ...

  10. HoG

    实现步骤 先计算每一个像素点位置上x和y方向上的梯度. 这样在每一个像素点位置上得到一个二维向量, 计算它的方向和模长 将图片分为一个个的cell, 如\(8\times 8\). 计算它的HOG: ...