当前位置: 首页 > news >正文

KD Tree

KD Tree

在第 \(k\) 维上的单次查询复杂度最坏为 \(\mathcal O(n^{1-k^{-1}})\)

struct KDT {constexpr static int N = 1e5 + 10, K = 2;double alpha = 0.725;struct node {int info[K];int mn[K], mx[K];} tr[N];int ls[N], rs[N], siz[N], id[N], d[N];int idx, rt, cur;int ans;KDT() {rt = 0;cur = 0;memset(ls, 0, sizeof ls);memset(rs, 0, sizeof rs);memset(d, 0, sizeof d);}void apply(int p, int son) {if (son) {for (int i = 0; i < K; i++) {tr[p].mn[i] = min(tr[p].mn[i], tr[son].mn[i]);tr[p].mx[i] = max(tr[p].mx[i], tr[son].mx[i]);}siz[p] += siz[son];}}void maintain(int p) {for (int i = 0; i < K; i++) {tr[p].mn[i] = tr[p].info[i];tr[p].mx[i] = tr[p].info[i];}siz[p] = 1;apply(p, ls[p]);apply(p, rs[p]);}int build(int l, int r) {if (l > r) return 0;vector<double> avg(K);for (int i = 0; i < K; i++) {for (int j = l; j <= r; j++) {avg[i] += tr[id[j]].info[i];}avg[i] /= (r - l + 1);}vector<double> var(K);for (int i = 0; i < K; i++) {for (int j = l; j <= r; j++) {var[i] += (tr[id[j]].info[i] - avg[i]) * (tr[id[j]].info[i] - avg[i]);}}int mid = (l + r) / 2;int x = max_element(var.begin(), var.end()) - var.begin();nth_element(id + l, id + mid, id + r + 1, [&](int a, int b) {return tr[a].info[x] < tr[b].info[x];});d[id[mid]] = x;ls[id[mid]] = build(l, mid - 1);rs[id[mid]] = build(mid + 1, r);maintain(id[mid]);return id[mid];}void print(int p) {if (!p) return;print(ls[p]);id[++idx] = p;print(rs[p]);}void rebuild(int &p) {idx = 0;print(p);p = build(1, idx);}bool bad(int p) {return alpha * siz[p] <= max(siz[ls[p]], siz[rs[p]]);}void insert(int &p, int cur) {if (!p) {p = cur;maintain(p);return;}if (tr[p].info[d[p]] > tr[cur].info[d[p]]) insert(ls[p], cur);else insert(rs[p], cur);maintain(p);if (bad(p)) rebuild(p);}void insert(vector<int> &a) {cur++;for (int i = 0; i < K; i++) {tr[cur].info[i] = a[i];}insert(rt, cur);}bool out(int p, vector<int> &a) {for (int i = 0; i < K; i++) {if (a[i] < tr[p].mn[i]) {return true;}}return false;}bool in(int p, vector<int> &a) {for (int i = 0; i < K; i++) {if (a[i] < tr[p].info[i]) {return false;}}return true;}bool all(int p, vector<int> &a) {for (int i = 0; i < K; i++) {if (a[i] < tr[p].mx[i]) {return false;}}return true;}void query(int p, vector<int> &a) {if (!p) return;if (out(p, a)) return;if (all(p, a)) {ans += siz[p];return;}if (in(p, a)) ans++;query(ls[p], a);query(rs[p], a);}int query(vector<int> &a) {ans = 0;query(rt, a);return ans;}
};
http://www.rkmt.cn/news/29236.html

相关文章:

  • 小波矩阵树:高效静态区间第 K 大查询
  • 分数运算类
  • 坐标压缩与离散化
  • 撸一个功能强大的基于语义的图像检索系统
  • 数论常见结论及例题
  • N8N Workflow Collection - 专业级自动化工作流库 - 详解
  • 莫比乌斯函数/反演
  • 同余方程组、拓展中国剩余定理 excrt
  • Apache POI 在 Linux 无图形界面环境下因字体配置问题导致Excel导出失败的解决方案 - 详解
  • 扩展欧几里得 exgcd
  • 防爆模乘
  • 20232314 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 最小割树 Gomory-Hu Tree
  • 图论常见结论及例题
  • 最短路径树(SPT问题)
  • 多源汇最短路(APSP问题)
  • 单源最短路径(SSSP问题)
  • 最近公共祖先 LCA
  • 题解:P3343 [ZJOI2015] 地震后的幻想乡
  • 暂存:P14214 [COI 2010] 圆圈 / KOLO
  • QMPlayer2解析
  • 2025年10月广州单位办公室搬家公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 权威调研榜单:东莞工厂装修公司OP3榜单好评深度解析
  • 2025年口碑好的FPC离型纸,环氧胶离型纸推荐TOP生产厂家
  • 2025年口碑好的数字地磅,电子汽车衡地磅厂家推荐及选择建议
  • 2025年10月进口艺术漆厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 最大公约数 gcd
  • 2025年上海注册公司/上海代理记账公司最新推荐榜,聚焦企业服务品质与特色业务竞争力深度剖析
  • 2025 年国内无缝钢管厂家最新推荐榜:20#/Q355 系列 / 合金管优质品牌权威测评及选购指南
  • 2025年优秀的冷却塔,鼓风式冷却塔定制定做