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

K-D Tree 模板

#include<bits/stdc++.h>
using namespace std;
using ld = long double;
using ll = long long;const int MAXN = 200005;
const ll INF = ll(2e18);template<int dimensions>
struct kd_tree {struct Point {ll _[dimensions];};ll dist2(const Point &x, const Point &y) const {ll ret = 0;for(int i = 0; i < dimensions; ++i) {ret += 1ll * (x._[i] - y._[i]) * (x._[i] - y._[i]);}return ret;}ld dist(const Point &x, const Point &y) const {return sqrtl(dist2(x, y));}struct Node {int ls, rs;Point x, l, r;}tr[MAXN];int ROOT;ll ans = INF;ll mind2(const Point &x, int y) {if(!y) {return INF;}ll ret = 0;for(int i = 0; i < dimensions; ++i) {ret += 1ll * max({0ll, tr[y].l._[i] - x._[i], x._[i] - tr[y].r._[i]}) * max({0ll, tr[y].l._[i] - x._[i], x._[i] - tr[y].r._[i]});}return ret;}ld mind(const Point &x, int y) {return (!y ? INF : sqrtl(mind2(x, y)));}void pushup(int u) {tr[u].l = tr[u].r = tr[u].x;for(int i = 0; i < dimensions; ++i) {if(tr[u].ls) {tr[u].l._[i] = min(tr[u].l._[i], tr[tr[u].ls].l._[i]), tr[u].r._[i] = max(tr[u].r._[i], tr[tr[u].ls].r._[i]);}if(tr[u].rs) {tr[u].l._[i] = min(tr[u].l._[i], tr[tr[u].rs].l._[i]), tr[u].r._[i] = max(tr[u].r._[i], tr[tr[u].rs].r._[i]);}}}int build(int l, int r, int k) {if(l > r) {return 0;}int mid = (l + r) >> 1;nth_element(tr + l, tr + mid, tr + r + 1, [k](const Node &x, const Node &y) {return x.x._[k] < y.x._[k];});tr[mid].ls = build(l, mid - 1, (k + 1) % dimensions);tr[mid].rs = build(mid + 1, r, (k + 1) % dimensions);pushup(mid);return mid;}void query(int u, int p) {if(!u) {return;}if(p != u) {ans = min(ans, dist2(tr[u].x, tr[p].x));}ll dl = mind2(tr[p].x, tr[u].ls), dr = mind2(tr[p].x, tr[u].rs);if(dl < dr) {if(dl < ans) {query(tr[u].ls, p);}if(dr < ans) {query(tr[u].rs, p);}}else {if(dr < ans) {query(tr[u].rs, p);}if(dl < ans) {query(tr[u].ls, p);}}}
};int n;
kd_tree<2> kdt;int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= n; ++i) {cin >> kdt.tr[i].x._[0] >> kdt.tr[i].x._[1];}kdt.ROOT = kdt.build(1, n, 0);for(int i = 1; i <= n; ++i) {kdt.query(kdt.ROOT, i);}cout << fixed << setprecision(4) << sqrtl(kdt.ans);return 0;
}
http://www.jsqmd.com/news/269561/

相关文章:

  • 2026年8款免费降AI工具实测推荐,毕业党必看 - 还在做实验的师兄
  • 基于深度学习的交通标志检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
  • 安全服务是什么
  • 毕业季来了!5款降AI率工具横评,最低能降到10%以下 - 还在做实验的师兄
  • 微信小程序毕设项目:基于nodejs的演唱会路演中小程序的设计与实现(源码+文档,讲解、调试运行,定制等)
  • LLM API Gateway:运用Comate Spec Mode创建大模型调用中转服务器
  • 选择高防IP时需要重点关注哪些因素
  • Label Studio导入预标注数据
  • 手把手教你降AI不伤文:保姆级操作让论文既通过检测又保持专业 - 还在做实验的师兄
  • SFT后训练32B-LLM的一些观察
  • 俄罗斯T1集团代表团到访深兰科技,就具身智能与复杂场景工程化应用达成多项合作共识
  • 2026年8款免费降AI率工具实测推荐,毕业党必看 - 还在做实验的师兄
  • 深兰科技与伊拉克国家基建发展基金会达成全方位合作:以AI技术全面助力伊拉克国家重建与民生发展
  • Android修改调试屏幕的选择方向
  • 从能量阻滞到流动:解码“被动学习”背后的家庭动能重构逻辑
  • chrome浏览器扩展“猫抓”
  • 机器人焊接节气设备
  • 【毕业设计】基于nodejs的演唱会路演中小程序的设计与实现(源码+文档+远程调试,全bao定制等)
  • Kanass实践教程 - 如何快速导入Jira、Mantis数据
  • 数据公司与AI五大主流合作模式
  • 毕业季必备:5款降AI工具帮你论文顺利通关 - 还在做实验的师兄
  • 知网AIGC检测不通过?毕业生必看的3步自救攻略 - 还在做实验的师兄
  • sward实践教程 - 如何有效保障文档的安全可靠
  • Kanass实践教程 - 如何做好测试管理
  • 数据可视化实战:用AI工具制作专业数据分析图表
  • 智装升级:工业4.0时代的高效包装革命
  • 从文本到仿真:多智能体大型语言模型(LLM)自动化化学工艺设计工作流程
  • 浜掕仈缃戝ぇ鍘侸ava姹傝亴鑰呴潰璇曟晠浜嬶細璋㈤鏈虹殑鎼炵瑧闈㈣瘯缁忓巻
  • 浜掕仈缃戝ぇ鍘侸ava闈㈣瘯绾疄锛氫弗鑲冮潰璇曞畼 vs 鎼炵瑧绋嬪簭鍛樿阿椋炴満
  • 2026 年 1 月防静电地坪厂家推荐排行榜,工厂车间/耐磨/自流平/防腐防静电地坪,环氧防静电地坪施工源头实力甄选 - 企业推荐官【官方】