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
相关文章推荐
- 2016 Multi-University Training Contest 3----解题报告
- HDU 5761_2016 Multi-University Training Contest 3
- grails中Template
- 220. Contains Duplicate III—medium
- 2016 Multi-University Training Contest 3 1011【鸽巢原理】
- 2016 Multi-University Training Contest 3
- 2016 Multi-University Training Contest 3 1002 Permutation Bo
- hdu 5754 2016 Multi-University Training Contest 3(各种博弈)
- 2016 Multi-University Training Contest 3 1001 Sqrt Bo
- POJ Problem 1363 Rails 【栈】
- Along with all the above benefits, you cannot overlook the space efficiency and performance gains in using DataFrames and Dataset APIs for two reasons.
- hdu 5753 Permutation Bo(2016 Multi-University Training Contest 3——组合)
- No.011 Container With Most Water
- 当你输入一个网址/点击一个链接,发生了什么?(以www.baidu.com为例)
- Apache 安装出现 Failed to open the Windows service manager, perhaps you forgot to log in as Adminstrator
- 2016 Multi-University Training Contest 3 Sqrt Bo
- main调用静态函数时候注意问题
- 2016 Multi-University Training Contest 3 Rower Bo
- shairo中的cache
- HDU 5319-Painter