zoukankan      html  css  js  c++  java
  • 【HDOJ】2966 In case of failure

    KD树,这东西其实在ML经常被使用,不过30s的时限还是第一次见。

      1 /* 2966 */
      2 #include <iostream>
      3 #include <string>
      4 #include <map>
      5 #include <queue>
      6 #include <stack>
      7 #include <set>
      8 #include <vector>
      9 #include <algorithm>
     10 #include <cstdio>
     11 #include <cmath>
     12 #include <ctime>
     13 #include <cstring>
     14 #include <climits>
     15 #include <cctype>
     16 using namespace std;
     17 
     18 typedef struct {
     19     int x, y;
     20 } Point_t;
     21 
     22 typedef struct {
     23     int axis;
     24     Point_t p;
     25     int l, r;
     26 } node_t;
     27 
     28 const int maxn = 1e5+5;
     29 Point_t P[maxn], P2[maxn];
     30 node_t nd[maxn];
     31 int L;
     32 __int64 ans;
     33 
     34 __int64 Eucl(Point_t a, Point_t b) {
     35     return 1LL*(a.x-b.x)*(a.x-b.x) + 1LL*(a.y-b.y)*(a.y-b.y);
     36 }
     37 
     38 bool compx(const Point_t &a, const Point_t &b) {
     39     return a.x < b.x;
     40 }
     41 
     42 bool compy(const Point_t &a, const Point_t &b) {
     43     return a.y < b.y;
     44 }
     45 
     46 void newNode() {
     47     ++L;
     48     nd[L].l = nd[L].r = 0;
     49 }
     50 
     51 int create_KD(int l, int r, int d) {
     52     if (l > r)
     53         return 0;
     54     newNode();
     55     int rt = L;
     56     nd[rt].axis = d&1;
     57     if (l == r) {
     58         nd[rt].p = P[l];
     59         return rt;
     60     }
     61     if (d & 1)
     62         sort(P+l, P+r+1, compy);
     63     else
     64         sort(P+l, P+r+1, compx);
     65     int mid = (l+r)>>1;
     66     nd[rt].p = P[mid];
     67     nd[rt].l = create_KD(l, mid-1, d+1);
     68     nd[rt].r = create_KD(mid+1, r, d+1);
     69     return rt;
     70 }
     71 
     72 void cal(int rt, Point_t p) {
     73     if (rt == 0)
     74         return ;
     75     int i, j, k;
     76     
     77     __int64 d = Eucl(nd[rt].p, p);
     78     if (d && d<ans)
     79         ans = d;
     80     
     81     if (nd[rt].axis) {
     82         j = nd[rt].p.y;
     83         k = p.y;
     84     } else {
     85         j = nd[rt].p.x;
     86         k = p.x;
     87     }
     88     
     89     if (k <= j)
     90         cal(nd[rt].l, p);
     91     else
     92         cal(nd[rt].r, p);
     93     
     94     if (1LL*(j-k)*(j-k) < ans) {
     95         if (k <= j)
     96             cal(nd[rt].r, p);
     97         else
     98             cal(nd[rt].l, p);
     99     }
    100 }
    101 
    102 int main() {
    103     int t, n;
    104     int i, j, k;
    105     
    106     #ifndef ONLINE_JUDGE
    107         freopen("data.in", "r", stdin);
    108         freopen("data.out", "w", stdout);
    109     #endif
    110     
    111     scanf("%d", &t);
    112     while (t--) {
    113         scanf("%d", &n);
    114         for (i=0; i<n; ++i) {
    115             scanf("%d %d", &P[i].x, &P[i].y);
    116             P2[i] = P[i];
    117         }
    118         L = 0;
    119         int rt = create_KD(0, n-1, 0);
    120         for (i=0; i<n; ++i) {
    121             ans = LLONG_MAX;
    122             cal(rt, P2[i]);
    123             printf("%I64d
    ", ans);
    124         }
    125     }
    126     
    127     #ifndef ONLINE_JUDGE
    128         printf("time = %d
    ", (int)(clock()));
    129     #endif
    130     
    131     return 0;
    132 }
  • 相关阅读:
    Java第十三天,内部类
    Java第十二天,权限修饰符
    Java面向对象基础
    opencv配置(win10+VS2015+opencv3.1)
    malloc函数
    C++用new创建对象和不用new创建对象的区别解析
    字符串匹配KMP算法中Next[]数组和Nextval[]数组求法
    C++将一个数组内容赋给另一个数组
    C++中的const和指针组合
    通过图片对比带给你不一样的KMP算法体验
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4464947.html
Copyright © 2011-2022 走看看