[SDOI2010]捉迷藏

链接

luogu

思路

k-dtree模板题

代码

  1. #include <bits/stdc++.h>
  2. #define ls (t[u].ch[0])
  3. #define rs (t[u].ch[1])
  4. #define cmin(a,b) (a>b?a=b:a)
  5. #define cmax(a,b) (a>b?a:a=b)
  6. using namespace std;
  7. const int N=5e5+7;
  8. const int INF=0x3f3f3f3f;
  9. int read() {
  10. int x=0,f=1;char s=getchar();
  11. for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
  12. for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
  13. return x*f;
  14. }
  15. int n,rt,WD;
  16. struct point {
  17. int x[2];
  18. bool operator < (const point &b) const {
  19. return x[WD]<b.x[WD];
  20. }
  21. }p[N];
  22. struct node{
  23. int mi[2],ma[2],ch[2];
  24. point a;
  25. }t[N];
  26. void update(int x,int y) {
  27. cmin(t[x].mi[0],t[y].mi[0]);
  28. cmin(t[x].mi[1],t[y].mi[1]);
  29. cmax(t[x].ma[0],t[y].ma[0]);
  30. cmax(t[x].ma[1],t[y].ma[1]);
  31. }
  32. void up(int u) {
  33. t[u].mi[0]=t[u].ma[0]=t[u].a.x[0];
  34. t[u].mi[1]=t[u].ma[1]=t[u].a.x[1];
  35. if(ls) update(u,ls);
  36. if(rs) update(u,rs);
  37. }
  38. int build(int l,int r,int wd) {
  39. if(l>r) return 0;
  40. int mid=(l+r)>>1;
  41. WD=wd;
  42. nth_element(p+l,p+mid,p+r+1);
  43. int u=mid;
  44. t[u].a=p[mid];
  45. ls=build(l,mid-1,wd^1);
  46. rs=build(mid+1,r,wd^1);
  47. up(u);
  48. return u;
  49. }
  50. int dis(point a,point b) {
  51. return abs(a.x[0]-b.x[0])+abs(a.x[1]-b.x[1]);
  52. }
  53. int get_min(int u,point a) {
  54. int rec=0;
  55. for(int i=0;i<2;++i)
  56. rec+=max(t[u].mi[i]-a.x[i],0)+max(a.x[i]-t[u].ma[i],0);
  57. return rec;
  58. }
  59. int get_max(int u,point a) {
  60. int rec=0;
  61. for(int i=0;i<2;++i)
  62. rec+=max(abs(a.x[i]-t[u].ma[i]),abs(a.x[i]-t[u].mi[i]));
  63. return rec;
  64. }
  65. int ans1,ans2;
  66. void query_min(point a,int u) {
  67. if(dis(a,t[u].a)) ans1=min(ans1,dis(a,t[u].a));
  68. int dl=INF,dr=INF;
  69. if(ls) dl=get_min(ls,a);
  70. if(rs) dr=get_min(rs,a);
  71. if(dl<dr) {
  72. if(ans1>dl) query_min(a,ls);
  73. if(ans1>dr) query_min(a,rs);
  74. } else {
  75. if(ans1>dr) query_min(a,rs);
  76. if(ans1>dl) query_min(a,ls);
  77. }
  78. }
  79. void query_max(point a,int u) {
  80. ans2=max(ans2,dis(a,t[u].a));
  81. int dl=-INF,dr=-INF;
  82. if(ls) dl=get_max(ls,a);
  83. if(rs) dr=get_max(rs,a);
  84. if(dl<dr) {
  85. if(ans2<dr) query_max(a,rs);
  86. if(ans2<dl) query_max(a,ls);
  87. } else {
  88. if(ans2<dl) query_max(a,ls);
  89. if(ans2<dr) query_max(a,rs);
  90. }
  91. }
  92. int main() {
  93. n=read();
  94. for(int i=1;i<=n;++i) p[i].x[0]=read(),p[i].x[1]=read();
  95. rt=build(1,n,0);
  96. int ans=INF;
  97. for(int i=1;i<=n;++i) {
  98. ans1=INF,ans2=0;
  99. query_min(p[i],rt);
  100. query_max(p[i],rt);
  101. // printf("(%d,%d) min=%d max=%d\n",p[i].x[0],p[i].x[1],ans1,ans2);
  102. ans=min(ans,ans2-ans1);
  103. }
  104. printf("%d",ans);
  105. return 0;
  106. }

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

  1. P2479 [SDOI2010]捉迷藏

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

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

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

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

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

  4. [SDOI2010]捉迷藏

    嘟嘟嘟 k-d tree板儿题. 建完树后对每一个点求一遍最小和最大曼哈顿距离,是曼哈顿,不是欧几里得. #include<cstdio> #include<iostream> ...

  5. luoguP2479 [SDOI2010]捉迷藏

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

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

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

  7. 2021.07.09 K-D树

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

  8. KD-Tree总结

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

  9. django模型操作

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表        

随机推荐

  1. Echarts 学习系列(1)-5分钟上手ECharts

    目录 写在前面 下载Echarts和主题 绘制一个简单的图表 写在前面 最近,在做某个项目的时候.需要使用的可视化的图表显数据.最后,选择了百度的Echarts. 下载Echarts和主题 1.获取E ...

  2. NuGet包 安装相关指令

    一.安装 1.安装指定版本类库install-package <程序包名> -version <版本号> 2.安装到指定的项目install-package <程序包名& ...

  3. C# vb .NET读取识别条形码线性条码EAN-13

    EAN-13是比较常见的条形码编码规则类型的一种.如何在C#,vb等.NET平台语言里实现快速准确读取该类型条形码呢?答案是使用SharpBarcode! SharpBarcode是C#快速高效.准确 ...

  4. Winform串口编程---接收数据demo(VSPD虚拟串口)

    参考地址:https://blog.csdn.net/memgxingfeixiang/article/details/52513970  https://blog.csdn.net/kevin_io ...

  5. 【开发笔记】-CentOS配置Java环境变量

    如果开发java应用,经常需要配置JAVA_HOME路径,如果是通过yum安装的jdk(一般系统会自带open-jdk),下面讲述配置过程: A 定位JDK安装路径 1. 终端输入: which ja ...

  6. SpringMVC中@RequestParam注解作用

    1.不使用@RequestParam  请求参数名必须和形参名称一样 2.使用@RequestParam    请求参数名必须和@RequestParam value属性值一样    请求参数名不必和 ...

  7. Synchronized与ReentrantLock区别总结

    这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式 ...

  8. centos安装redis并且加入开机启动

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_41114593/articl ...

  9. 认识Redis

    认识的Redis 官方原文: Redis is an open source (BSD licensed), in-memory data structure store, used as a dat ...

  10. Ansible-ansible命令

    Ansible是用于执行"远程操作"的简单工具.该命令允许针对一组主机定义并运行单个任务剧本. 常用选项 说明 --ask-vault-pass 请求保险库密码 --become- ...