首页 > 其他分享 >K-D Tree

K-D Tree

时间:2022-09-22 21:34:48浏览次数:28  
标签:rt Min int min Tree query er

bool o;//当前维度
struct point 
{
    int p[2];
    friend bool operator <(point A, point B) { return A.p[o] < B.p[o]; }
    friend bool operator !=(point A, point B) { return A.p[0] != B.p[0] | A.p[1] != B.p[1]; }
}; point a[Z];
inline int calc(point x, point y) { return abs(x.p[0] - y.p[0]) + abs(x.p[1] - y.p[1]); }
struct KDtree
{
    int l, r;
    point pt;
    int max[2], min[2];//最大与最小的横纵坐标
    #define lk kd[rt].l
    #define rk kd[rt].r
}; KDtree kd[Z];
int root, inf = 2e9;
inline void pushup(int rt)
{
    for (re i = 0; i <= 1; i++)
    {
        if (lk) kd[rt].max[i] = max(kd[rt].max[i], kd[lk].max[i]), kd[rt].min[i] = min(kd[rt].min[i], kd[lk].min[i]);
        if (rk) kd[rt].max[i] = max(kd[rt].max[i], kd[rk].max[i]), kd[rt].min[i] = min(kd[rt].min[i], kd[rk].min[i]);
    }
}
int build(int l, int r, bool op)
{
    o = op;//自定义排序方式(表示维度)
    int rt = l + r >> 1;
    nth_element(a + l, a + rt, a + r + 1);//定位中位数
    kd[rt].pt = a[rt];
    for (re i = 0; i <= 1; i++) kd[rt].max[i] = kd[rt].min[i] = a[rt].p[i];
    if (l < rt) lk = build(l, rt - 1, op ^ 1);
    if (r > rt) rk = build(rt + 1, r, op ^ 1);
    pushup(rt); return rt;
}
int Max, Min;
inline int estimate_max(int rt, point x)//估价函数
{
    int sum = 0;
    for (re i = 0; i <= 1; i++)//找到理论极限距离最大的点对(已扩展的最大平面的顶点)
        sum += max(abs(kd[rt].max[i] - x.p[i]), abs(kd[rt].min[i] - x.p[i]));
    return sum;
}
inline int estimate_min(int rt, point x)
{
    int sum = 0;
    for (re i = 0; i <= 1; i++)//如果处于max和min的两侧,直接取最近;如果处于中间,则不知道还有没有其他的点,无法预估
        sum += max(x.p[i] - kd[rt].max[i], 0) + max(kd[rt].min[i] - x.p[i], 0);
    return sum;
}
void query_max(int rt, point x)
{
    Max = max(Max, calc(kd[rt].pt, x));
    int el = 0, er = 0;
    if (lk) el = estimate_max(lk, x);
    if (rk) er = estimate_max(rk, x);
    if (el > er)//先跑最有可能达到最大值的
    {
        if (Max < el) query_max(lk, x);
        if (Max < er) query_max(rk, x);
    }
    else
    {
        if (Max < er) query_max(rk, x);
        if (Max < el) query_max(lk, x);
    }
}
void query_min(int rt, point x)
{
    if (kd[rt].pt != x) Min = min(Min, calc(kd[rt].pt, x));
    int el = inf, er = inf;
    if (lk) el = estimate_min(lk, x);
    if (rk) er = estimate_min(rk, x);
    if (el < er)//先跑最有可能达到最小值的
    {
        if (Min > el) query_min(lk, x);
        if (Min > er) query_min(rk, x);
    }
    else
    {
        if (Min > er) query_min(rk, x);
        if (Min > el) query_min(lk, x);
    }
}
inline int ask(point x)
{
    Max = 0, Min = inf;
    query_max(root, x), query_min(root, x);
    return Max - Min;
}

标签:rt,Min,int,min,Tree,query,er
From: https://www.cnblogs.com/sandom/p/16720924.html

相关文章

  • 【解题报告】SP10628 COT-Count on a tree
    SP10628COT这道题的传送门双倍经验,两个题一样的啦简要题意给出一颗n个节点的树,每个节点都有一个权值,求u到v的第k小权值其实就是树上的区间第k小主席树+树上差分......
  • CF1540B Tree Array 题解
    CF1540BTreeArray给定一棵\(n\)个节点的树。对于这棵树,我们通过下列方法来生成一个序列:等概率选择这\(n\)个节点中的一个节点,并对这个节点打上标记(初始时没有节......
  • WebForm中的treeView的简单使用
    我们要使用treeView,首先需要对应树状图关系的表结构,如省市区的结构,大概如下 完成效果图(省市区结构),大概如下: 新增一个citys.aspx页面,在页面中添加treeView<div>......
  • leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与
    一、题目大意给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:输入:pre......
  • Antd Tree,实现排序拖动,父子层级内外拖动
    拖动属性dropToGap,dropPosition属性解释:dropToGap:boolean类型,true代表拖拽到节点之间的缝隙中,false代表拖拽到节点上,即节点的内容区。dropPosition:拖拽的时候,针对一......
  • 使用element-tree实现id相同的选择
    最近做一个项目,需要树形结构中 id相同的数据,选中或取消一个,其他的也要选中和取消。上网查案例,有一个需求相同的,但是需要修改源码。我觉得不靠谱。于是乎,自己写了一个,供......
  • 带有 TreeView 下拉菜单的 ComboBox
    AComboBoxwithaTreeViewDrop-DownPostedon November4,2010 That’sright,exactlywhatitsaysonthebox.Butwhydoweneedacontrollikethis?We......
  • JetBrains 显示项目缩进的竖线(显示树状缩进/Show tree indent guides)
      显示项目缩进的垂直线,让项目的层次结构更清晰做法:File→Setting →Appearance →UIOptions →勾选Showtreeindentguides  最终效果  ......
  • el-tree增加提示语
    elementuitree树形控件加提示信息 <el-tree:data="tieLinedata":props="defaultProps"@node-click="handleNodeClick"><spancla......
  • Codeforces Round #316 (Div. 2) D Tree Requests
    TreeRequests判断\(V_i\)的子树中,深度为\(h_i\)的结点上所带有的字符,能否组成一个回文串启发式合并维护所有深度上不同字符的数量,并且维护其奇数字符出现的次数如......