嘟嘟嘟




k-d tree板儿题。

建完树后对每一个点求一遍最小和最大曼哈顿距离,是曼哈顿,不是欧几里得。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<cstdlib>
  7. #include<cctype>
  8. #include<vector>
  9. #include<stack>
  10. #include<queue>
  11. using namespace std;
  12. #define enter puts("")
  13. #define space putchar(' ')
  14. #define Mem(a, x) memset(a, x, sizeof(a))
  15. #define In inline
  16. typedef long long ll;
  17. typedef double db;
  18. const ll INF = 1e18;
  19. const db eps = 1e-8;
  20. const int maxn = 1e5 + 5;
  21. inline ll read()
  22. {
  23. ll ans = 0;
  24. char ch = getchar(), last = ' ';
  25. while(!isdigit(ch)) {last = ch; ch = getchar();}
  26. while(isdigit(ch)) {ans = (ans << 1) + (ans << 3) + ch - '0'; ch = getchar();}
  27. if(last == '-') ans = -ans;
  28. return ans;
  29. }
  30. inline void write(ll x)
  31. {
  32. if(x < 0) x = -x, putchar('-');
  33. if(x >= 10) write(x / 10);
  34. putchar(x % 10 + '0');
  35. }
  36. int n, Dim;
  37. struct Tree
  38. {
  39. int ch[2], id;
  40. ll d[2], Min[2], Max[2];
  41. In bool operator < (const Tree& oth)const
  42. {
  43. return d[Dim] < oth.d[Dim];
  44. }
  45. }t[maxn], a[maxn], b[maxn];
  46. int root, tcnt = 0;
  47. In void pushup(int now)
  48. {
  49. for(int i = 0; i < 2; ++i)
  50. {
  51. if(t[now].ch[0])
  52. {
  53. t[now].Max[i] = max(t[now].Max[i], t[t[now].ch[0]].Max[i]);
  54. t[now].Min[i] = min(t[now].Min[i], t[t[now].ch[0]].Min[i]);
  55. }
  56. if(t[now].ch[1])
  57. {
  58. t[now].Max[i] = max(t[now].Max[i], t[t[now].ch[1]].Max[i]);
  59. t[now].Min[i] = min(t[now].Min[i], t[t[now].ch[1]].Min[i]);
  60. }
  61. }
  62. }
  63. In void build(int& now, int L, int R, int d)
  64. {
  65. if(L > R) return;
  66. int mid = (L + R) >> 1;
  67. Dim = d;
  68. nth_element(a + L, a + mid, a + R + 1);
  69. t[now = ++tcnt] = a[mid];
  70. t[now].ch[0] = t[now].ch[1] = 0; t[now].id = a[mid].id;
  71. t[now].Min[0] = t[now].Max[0] = t[now].d[0];
  72. t[now].Min[1] = t[now].Max[1] = t[now].d[1];
  73. build(t[now].ch[0], L, mid - 1, d ^ 1);
  74. build(t[now].ch[1], mid + 1, R, d ^ 1);
  75. pushup(now);
  76. }
  77. In ll dis(int now, ll* d)
  78. {
  79. return abs(t[now].d[0] - d[0]) + abs(t[now].d[1] - d[1]);
  80. }
  81. In ll price_Max(int now, ll* d)
  82. {
  83. ll ret = 0;
  84. for(int i = 0; i < 2; ++i)
  85. {
  86. ll Max = max(abs(t[now].Max[i] - d[i]), abs(t[now].Min[i] - d[i]));
  87. ret += Max;
  88. }
  89. return ret;
  90. }
  91. In ll price_Min(int now, ll * d)
  92. {
  93. ll ret = 0;
  94. for(int i = 0; i < 2; ++i)
  95. if(t[now].Min[i] > d[i]) ret += t[now].Min[i] - d[i];
  96. else if(t[now].Max[i] < d[i]) ret += d[i] - t[now].Max[i];
  97. return ret;
  98. }
  99. ll Max = -1, Min = INF;
  100. In void query_Max(int now, ll* d, int id)
  101. {
  102. if(!now) return;
  103. if(t[now].id ^ id) Max = max(Max, dis(now, d));
  104. ll disL = price_Max(t[now].ch[0], d), disR = price_Max(t[now].ch[1], d);
  105. if(disL < disR) swap(disL, disR), swap(t[now].ch[0], t[now].ch[1]);
  106. if(disL > Max) query_Max(t[now].ch[0], d, id);
  107. if(disR > Max) query_Max(t[now].ch[1], d, id);
  108. }
  109. In void query_Min(int now, ll* d, int id)
  110. {
  111. if(!now) return;
  112. if(t[now].id ^ id) Min = min(Min, dis(now, d));
  113. ll disL = price_Min(t[now].ch[0], d), disR = price_Min(t[now].ch[1], d);
  114. if(disL > disR) swap(disL, disR), swap(t[now].ch[0], t[now].ch[1]);
  115. if(disL < Min) query_Min(t[now].ch[0], d, id);
  116. if(disR < Min) query_Min(t[now].ch[1], d, id);
  117. }
  118. int main()
  119. {
  120. n = read();
  121. for(int i = 1; i <= n; ++i) a[i].d[0] = read(), a[i].d[1] = read(), a[i].id = i, b[i] = a[i];
  122. build(root, 1, n, 0);
  123. ll ans = INF;
  124. for(int i = 1; i <= n; ++i)
  125. {
  126. Min = INF, Max = -1;
  127. query_Max(root, b[i].d, i); query_Min(root, b[i].d, i);
  128. ans = min(ans, Max - Min);
  129. }
  130. write(ans), enter;
  131. return 0;
  132. }

[SDOI2010]捉迷藏的更多相关文章

  1. [SDOI2010]捉迷藏 K-Dtree

    [SDOI2010]捉迷藏 链接 luogu 思路 k-dtree模板题 代码 #include <bits/stdc++.h> #define ls (t[u].ch[0]) #defi ...

  2. luoguP2479 [SDOI2010]捉迷藏

    https://www.luogu.org/problemnew/show/P2479 据说可以用线段树做但是我不会,只能写一个 KD-Tree 了 对于每个点求出距离它最远的点和最近的点的距离,然后 ...

  3. P2479 [SDOI2010]捉迷藏

    传送门 KDtree是个吼东西啊-- 枚举每一个点,然后求出离他距离最远和最近的点的距离,更新答案 然而为什么感觉KDtree只是因为剪枝才能跑得动呢-- //minamoto #include< ...

  4. 模板—K-D-tree(P2479 [SDOI2010]捉迷藏)

    #include<algorithm> #include<iostream> #include<cstdio> #include<cmath> #def ...

  5. 【题解】[SDOI2010]捉迷藏

    题目链接:https://www.luogu.com.cn/problem/P2479 题目大意:求平面\(n\)个点中,到其它\(n-1\)个点的曼哈顿距离最大和最小距离之差最小的点,求出这个这个距 ...

  6. [学习笔记]K-D Tree

    以前其实学过的但是不会拍扁重构--所以这几天学了一下 \(K-D\ Tree\) 的正确打开姿势. \(K\) 维 \(K-D\ Tree\) 的单次操作最坏时间复杂度为 \(O(k\times n^ ...

  7. KD-Tree总结

    KD-Tree总结 问题引入 平面上有\(n\)个点,\(q\)组询问,每一次查询距离\((x,y)\)最近的点对,强制在线. 问题解决 暴力 显然我们可以直接枚举点然后算距离取\(min\),这样子 ...

  8. 2021.07.09 K-D树

    2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...

  9. [BZOJ1941][Sdoi2010]Hide and Seek

    [BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...

随机推荐

  1. 理解运用JS的闭包、高阶函数、柯里化

    JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...

  2. Shell 函数定义与调用

    linux shell 可以用户定义函数,然后在 shell 脚本中可以随便调用. 以一个计算两数之和的函数为例: #! /bin/bash # 函数定义 sum(){ return $(($1+$2 ...

  3. 如何查看oracle用户具有的权限和角色

    .查看所有用户: select * from dba_users; select * from all_users; select * from user_users; .查看用户或角色系统权限(直接 ...

  4. 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI

    一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...

  5. MVC基础篇—控制器与视图数据的传递

    Viewdata,Viewbag,Tempdata 1  Vewdata:简单来说就是数据字典,通过键值对的形式来存放数据.举例如下: //后台控制器代码: public ActionResult V ...

  6. Nullable<System.DateTime>日期格式转换 (转载)

    一.问题 1.html页面中时间显示出错,数据库中时间是正确的. 原因:没有把DateTime转成String类型. 2.  在C#中,发现不能直接使用ToString("yyyy-MM-d ...

  7. 2.C++中的bool类型,三目运算符,引用

    本章主要内容: 1)bool类型 2)三目运算符 3)引用 1.布尔型bool 在C++中,bool类型只有true(非0)和flase(0)两个值,且bool类型只占用了一个字节. 例如: #inc ...

  8. [转] Mac下 快速写博客的软件 MarsEdit

    正文 marsedit最好. 这东西还是收费的,这里, 我给个注册码: Name: The Blade SN: RSME3-DA4KUN-3EL6Y-MXD2X-LYMT9-6KGX8-4 ~~~~~ ...

  9. 设置div背景透明的CSS样式

    div背景透明样式: 样式代码: .alert{filter:alpha(opacity=100); /* IE */ -moz-opacity:1.0; /* Moz + FF */ opacity ...

  10. python2&python3

    1.Python3 使用 print 必须要以小括号包裹打印内容,比如 print('hi')   Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print 'hi ...