您的位置:首页 > 大数据 > 人工智能

HDU 2966 In case of failure KD树

2016-07-27 09:09 393 查看
第一道kd树
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <queue>

using namespace std;

#define N 100005

#define lson rt << 1
#define rson rt << 1 | 1
#define Sqrt2(x) (x) * (x)

int n, idx;

struct Node
{
long long feature[2];
bool operator < (const Node &u) const
{
return feature[idx] < u.feature[idx];
}
}_data
, _data2
;

long long ans;

class KDTree {

public:
void Build(int, int, int, int);
void Query(Node, int, int, int, int);
}kd;

void KDTree::Build(int l, int r, int rt, int dept)
{
if (l > r) return;
idx = dept % 2;
int mid = (l + r) >> 1;
nth_element(_data + l, _data + mid, _data + r + 1);
Build(l, mid - 1, lson, dept + 1);
Build(mid + 1, r, rson, dept + 1);
}

void KDTree::Query(Node p, int l, int r, int rt, int dept)
{
if (l > r) return;
long long sum = 0;
int mid = (l + r) >> 1;
for (int i = 0; i < 2; i++)
sum += Sqrt2(_data[mid].feature[i] - p.feature[i]);
//printf("%d\n", cur.first);
int dim = dept % 2;
bool fg = 0;
int x = lson;
int y = rson;
if (p.feature[dim] < _data[mid].feature[dim])
{
Query(p, l, mid-1, x, dept + 1);
}
else
{
Query(p, mid+1, r, x, dept + 1);
}
if(sum == 0)
{
if (Sqrt2(p.feature[dim] - _data[mid].feature[dim]) < ans)
{
fg = 1;
}
}
else
{
if(ans == -1)
{
ans = sum;
}
else if (sum < ans)
{
ans = sum;
}

if (Sqrt2(p.feature[dim] - _data[mid].feature[dim]) < ans)
{
fg = 1;
}
}
if(fg)
{
if (p.feature[dim] < _data[mid].feature[dim])
{
Query(p, mid+1, r, x, dept + 1);
}
else
{
Query(p, l, mid-1, x, dept + 1);
}
}
}

int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 2; j++)
scanf("%I64d", &_data[i].feature[j]);
_data2[i] = _data[i];
}
kd.Build(0, n - 1, 1, 0);
for (int i = 0; i < n; i++)
{
Node p;
ans = -1;
for (int j = 0; j < 2; j++)
p.feature[j] = _data2[i].feature[j];
kd.Query(p, 0, n-1, 1, 0);
printf("%I64d\n", ans);
}
}
return 0;
}
http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html http://blog.csdn.net/acdreamers/article/details/44664645 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 http://my.oschina.net/keyven/blog/221792
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: