尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

数据结构 Trick 之:KDT 求 k 近/远 点

数据结构 Trick 之:KDT 求 k 近/远 点
📅 发布时间:2026/6/22 1:57:50

注意,此 Trick 的时间复杂度是错的,但是貌似目前没人能卡满。

能够解决的问题

  • \(O(n \sqrt n)\) 可过。
  • 维护二维平面。
  • 每次求到一个点的 \(k\) 近或 \(k\) 远点。
  • \(k\) 很小(\(20\) 左右)

思路

二维空间想到 KDTree(TreeKevin Durant Tree)。

众所周知,动态维护 \(k\) 近或 \(k\) 远点只需要一个 \(k\) 个点的堆即可,那么我们就有了一个剪枝:当前节点维护的区间到询问点的理论极值(写个估价函数就行)都比不上当前 \(k\) 大/小值,就返回。

结束了,就是这么简单。

例题与代码

P2093 [国家集训队] JZPFAR - 洛谷

#include <bits/stdc++.h>
using namespace std;namespace gxk {void main() ;
}
int main() {ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);gxk::main();return 0;
}// ---#define int long long
namespace gxk {constexpr int maxn = 100010;struct point {int x[2];} p;int n, m, x, b[maxn];struct value {int dis, idx;bool operator < (const value o) const {return dis > o.dis || (dis == o.dis && idx < o.idx);}} ;priority_queue <value> q;struct Kevin_DurantNode {point x, l, r;int ls, rs, idx;} nodes[maxn];int cnt;struct Kevin_DurantTree {void pushup(int u) {for (int k = 0; k < 2; k++) {nodes[u].l.x[k] = nodes[u].r.x[k] = nodes[u].x.x[k];if (nodes[u].ls) {nodes[u].l.x[k] = min(nodes[u].l.x[k], nodes[nodes[u].ls].l.x[k]);nodes[u].r.x[k] = max(nodes[u].r.x[k], nodes[nodes[u].ls].r.x[k]);}if (nodes[u].rs) {nodes[u].l.x[k] = min(nodes[u].l.x[k], nodes[nodes[u].rs].l.x[k]);nodes[u].r.x[k] = max(nodes[u].r.x[k], nodes[nodes[u].rs].r.x[k]);}}return ;}void build(int &u, int l, int r, int k) {int midd = ((l + r) >> 1);nth_element(b + l, b + midd, b + r + 1, [k](int a, int b){return nodes[a].x.x[k] < nodes[b].x.x[k];});u = b[midd];
//			cout << nodes[u].x.x[0] << ' ' << nodes[u].x.x[1] << '\n';if (l < midd) build(nodes[u].ls, l, midd - 1, k ^ 1);if (r > midd) build(nodes[u].rs, midd + 1, r, k ^ 1);pushup(u);return ;}int dis(int x, int y) {return (x - p.x[0]) * (x - p.x[0]) + (y - p.x[1]) * (y - p.x[1]);}int evaluate(int u) {return max({dis(nodes[u].l.x[0], nodes[u].l.x[1]), dis(nodes[u].l.x[0], nodes[u].r.x[1]), dis(nodes[u].r.x[0], nodes[u].l.x[1]), dis(nodes[u].r.x[0], nodes[u].r.x[1])});}void query(int u) {value now = {evaluate(u), nodes[u].idx};if (!(now < q.top())) return ;now = {dis(nodes[u].x.x[0], nodes[u].x.x[1]), nodes[u].idx};if (now < q.top()) q.pop(), q.push(now);if (nodes[u].ls && nodes[u].rs) {value vl = {evaluate(nodes[u].ls), nodes[nodes[u].ls].idx}, vr = {evaluate(nodes[u].rs), nodes[nodes[u].rs].idx};if (vl < vr) {query(nodes[u].ls);query(nodes[u].rs);} else {query(nodes[u].rs);query(nodes[u].ls);}} else if (nodes[u].ls) {query(nodes[u].ls);} else if (nodes[u].rs) {query(nodes[u].rs);}return ;}} kdt;int root;void main() {cin >> n;cnt = n;for (int i = 1; i <= n; i++) {cin >> nodes[i].x.x[0] >> nodes[i].x.x[1];nodes[i].idx = i;b[i] = i;}kdt.build(root, 1, n, 0);cin >> m;while (m--) {cin >> p.x[0] >> p.x[1] >> x;while (!q.empty()) q.pop();while (x--) {q.push({-1, 0});}kdt.query(root);cout << q.top().idx << '\n';}return ;}
}

相关新闻

  • .NET 8程序配置版本及产品信息
  • C语言第二讲:进制转化
  • 抽象代数-学习笔记

最新新闻

  • LLM重排冷启动推荐:覆盖率与曝光偏差的诊断与优化策略
  • 2026年芯片与微电子展会全攻略,如何挑选最适合您的参展平台? - 品牌深度评测
  • 虚拟支持者在远程心理治疗中的应用:技术赋能与伦理实践
  • 2026年苏州地区污水池废气处理优质厂家选择与效能解析 - 品牌鉴赏官2026
  • 如何永久保存微信聊天记录:三步实现个人数据主权回归
  • 终极宝可梦存档管理指南:如何用PKSM一站式管理全世代精灵收藏

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号