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 ...
随机推荐
- a 标签
a标签成为块元素后,宽度会百分百撑开,但高度不会,需要加高度.
- WordPress插件制作教程概述
接下来的一段时间里,开始为大家讲解WordPress插件制作系列教程,这篇主要是对WordPress插件的一些介绍和说明,还有一些我们需要注意的地方,以及需要掌握的知识. WordPress插件允许你 ...
- 利用cookies获取登录后的网页
众所周知,HTTP连接是无状态的,那么问题来了,怎么记录用户的登录信息呢?通常的做法是用户第一次发送HTTP请求时,在HTTP Server端生成一个SessionID,SessionID会对应每个会 ...
- “弹出DVD驱动器错误”解决方法
错误描述:(win7环境) 买了个开发板,赠送了一些光盘,放在电脑光驱中打开后,电脑就疯狂响,可能是光盘质量太差.用完后在弹出时显示“弹出DVD驱动器错误”[见图1].直接按主机上弹出按钮也没有反应. ...
- FAT16文件系统简介
有必要说明一下,以下对FAT16系统的介绍,很多都是参考文献.由于FAT16系统一般在U盘.MMC卡.SD卡以及一些小型存储设备上使用比较多,以后把这些小型存储设备统称为存储卡,这里仅局限于对存储卡的 ...
- LeeCode-Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- Mysql 添加用户和数据库授权
注:我的运行环境是widnows xp professional + MySQL5.0 一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY ...
- UIView 弹出动画
// 展开动画 - (void)beginAnimations { CGContextRef context = UIGraphicsGetCurrentContext(); [UIView begi ...
- iOS 实时监听app的网络连接状态
实际iOS开发中,在网络通信中我们大部分使用第三方(只谈短链),譬如 AFNetworking.ASIHttpRequest(这个停更了,想必现在没多少人用),swift的 Alamofire 等. ...
- 网络编程API-下 (I/O复用函数)
IO复用是Linux中的IO模型之中的一个,IO复用就是进程预先告诉内核须要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理.从而不会在单个IO上堵塞了. Linu ...