hdu 2966 In case of failure k-d树
给n个点, 求出每个点到离它最近的点的距离。
直接建k-d树然后查询就可以 感觉十分神奇...
明白了算法原理但是感觉代码还不是很懂...
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef complex <double> cmx;
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
struct node
{
int p[];
int l, r, idx;
int operator [] (const int& idx)const
{
return p[idx];
}
}a[];
int cmpflag, idx[];
ll ans;
bool cmp(const node& x, const node& y)
{
return x[cmpflag] < y[cmpflag];
}
int build(int l, int r, int flag)
{
int mid = l + r >> ;
cmpflag = flag;
nth_element(a+l, a+mid, a+r+, cmp);
idx[a[mid].idx] = mid;
a[mid].l = (l != mid)?build(l, mid - , !flag):;
a[mid].r = (r != mid)?build(mid + , r, !flag):;
return mid;
}
ll dis(ll x, ll y = )
{
return x * x + y * y;
}
ll query(int rt, int flag, int x, int y)
{
ll tmp = dis(x - a[rt][], y - a[rt][]);
if(tmp) {
ans = min(ans, tmp);
}
if(a[rt].l && a[rt].r) {
bool d = !flag ? (x <= a[rt][]) : (y <= a[rt][]);
ll dist = !flag ? dis(x - a[rt][]) : dis(y - a[rt][]);
query(d?a[rt].l:a[rt].r, !flag, x, y);
if(dist < ans) {
query(!d?a[rt].l:a[rt].r, !flag, x, y);
}
} else if(a[rt].l) {
query(a[rt].l, !flag, x, y);
} else if(a[rt].r) {
query(a[rt].r, !flag, x, y);
}
}
int main()
{
int t, n;
cin>>t;
while(t--) {
cin>>n;
for(int i = ; i <= n; i++) {
scanf("%d%d", &a[i].p[], &a[i].p[]);
a[i].idx = i;
}
int root = build(, n, );
for(int i = ; i <= n; i++) {
ans = 1e18;
query(root, , a[idx[i]][], a[idx[i]][]);
printf("%lld\n", ans);
}
}
return ;
}
hdu 2966 In case of failure k-d树的更多相关文章
- HDU #2966 In case of failure
Overview 给出平面上两两不重合的\(n\)个整点, 求每个点到它在其他\(n-1\)个点的最近临点的欧几里得距离的平方. Solution k-d tree 模板题. 关于k-d tree, ...
- 【HDOJ】2966 In case of failure
KD树,这东西其实在ML经常被使用,不过30s的时限还是第一次见. /* 2966 */ #include <iostream> #include <string> #incl ...
- In case of failure
In case of failure http://acm.hdu.edu.cn/showproblem.php?pid=2966 Time Limit: 60000/30000 MS (Java/O ...
- 【 HDU2966 】In case of failure(KD-Tree)
BUPT2017 wintertraining(15) #5E HDU - 2966 题意 给平面直角坐标系下的n个点的坐标,求离每个点和它最近点的距离的平方.\(2 \le n \le 10^5\) ...
- HDU 6121 Build a tree(k叉树的子树大小相异)
http://acm.hdu.edu.cn/showproblem.php?pid=6121 题目大意: 给你一颗 n 个节点的完全 k 叉树,问你这棵树中所有子树结点个数的总异或值. 分析: 我们很 ...
- 狂K 线段树
想写好树剖~~线段树very important HDU 1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- HDU 2665(Kth number-区间第k大[内存限制+重数])
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 2665.Kth number 区间第K小
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2639 01背包求第k大
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- pymssql文档
原文地址 http://pymssql.org/en/latest/ref/_mssql.html _mssql module reference pymssql模块类,方法和属性的完整文档. Com ...
- js入门基础7-2 (求模-隔行变色)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- debian修改系统语言为英文
原文地址:http://www.chenyudong.com/archives/debian-change-locale-language.html 修改/etc/default/locale 文件里 ...
- django最简单表单入门
两个html页面,存放于某个应用下的templates文件夹下. index.html 提交 点击“提交”按钮后,会调入第二个页面hello.html显示文本框的内容 原理是通过form的action ...
- iOS开发之OC篇-响应式编程Reactive Cocoa
一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...
- LINUX系统GIT使用教程
Git使用笔记. 1 安装GIT $ sudo aptitude install git $ sudo aptitude install git-doc git-svn git-email git ...
- MongoDB insert performance rapidly dropping
http://dba.stackexchange.com/questions/65554/mongodb-insert-performance-rapidly-dropping http://www. ...
- java时间比较
public static void main(String[] args) throws Exception{//判断某个时间是否为当前时间 String dataStr="2014-07 ...
- STL中,迭代器的分类
五类迭代器如下: 1.输入迭代器:只读,一次传递 为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取.一个输 ...
- Windows多线程同步系列之三-----事件对象
事件是一个内核事件,内核事件是什么呢,我理解也不深入也不好说,暂且理解为一个内核维护的数据类型吧通过内核事件同步主要 的方法是对事件的信号有和无来进行同步. 比如当我们一个线程进入一段临界代码(独占代 ...