题意:求给出的所有点的最远点减最近点的最小差值

KD树的最远估价和最近估价略微不同,直接找最远垂线,反正xjb改一下就过了

  1. #include<bits/stdc++.h>
  2. #define rep(i,j,k) for(register int i=j;i<=k;i++)
  3. #define rrep(i,j,k) for(register int i=j;i>=k;i--)
  4. #define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
  5. #define print(a) printf("%lld",(ll)(a))
  6. #define println(a) printf("%lld\n",(ll)(a))
  7. #define printbk(a) printf("%lld ",(ll)(a))
  8. using namespace std;
  9. const int MAXN = 5e5+11;
  10. const int INF = 0x7fffffff;
  11. typedef long long ll;
  12. ll read(){
  13. ll x=0,f=1;register char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  16. return x*f;
  17. }
  18. int D;
  19. struct point{
  20. int x[2];
  21. bool operator < (const point &rhs) const{
  22. return x[D]<rhs.x[D];
  23. }
  24. };
  25. struct KD{
  26. int son[MAXN][2];
  27. point p[MAXN],mn[MAXN],mx[MAXN];
  28. int root,ans,tot;
  29. void init(){
  30. ans=INF; tot=D=0;
  31. }
  32. void pu(int o){
  33. rep(i,0,1){
  34. if(son[o][i]) rep(j,0,1){
  35. if(mn[son[o][i]].x[j]<mn[o].x[j]) mn[o].x[j]=mn[son[o][i]].x[j];
  36. if(mx[son[o][i]].x[j]>mx[o].x[j]) mx[o].x[j]=mx[son[o][i]].x[j];
  37. }
  38. }
  39. }
  40. int build(int now,int l,int r){
  41. int mid=l+r>>1;
  42. tot++; son[mid][0]=son[mid][1]=0;
  43. D=now;nth_element(p+l,p+mid,p+r+1);//[l,r+1)
  44. mn[mid].x[0]=mx[mid].x[0]=p[mid].x[0];
  45. mn[mid].x[1]=mx[mid].x[1]=p[mid].x[1];
  46. if(l<mid) son[mid][0]=build(now^1,l,mid-1);
  47. if(r>mid) son[mid][1]=build(now^1,mid+1,r);
  48. pu(mid);
  49. return mid;
  50. }
  51. void insert(int &o,int now,point v){
  52. if(!o){
  53. o=++tot;
  54. p[o].x[0]=mn[o].x[0]=mx[o].x[0]=v.x[0];
  55. p[o].x[1]=mn[o].x[1]=mx[o].x[1]=v.x[1];
  56. }else{
  57. insert(son[o][p[o].x[now]<v.x[now]],now^1,v);
  58. pu(o);
  59. }
  60. }
  61. inline int dis(point &a,point &b){
  62. return abs(a.x[0]-b.x[0])+abs(a.x[1]-b.x[1]);
  63. }
  64. inline int eva(int o,point &v){
  65. int res=0;
  66. rep(i,0,1) if(v.x[i]<mn[o].x[i]||v.x[i]>mx[o].x[i]){
  67. if(v.x[i]<mn[o].x[i]) res+=mn[o].x[i]-v.x[i];
  68. else res+=v.x[i]-mx[o].x[i];
  69. }
  70. return res;
  71. }
  72. void query1(int o,point v){
  73. if(!o) return;
  74. int d1=dis(p[o],v),d2=INF,d3=INF;
  75. if(d1<ans&&d1!=0) ans=d1;
  76. if(son[o][0]) d2=eva(son[o][0],v);
  77. if(son[o][1]) d3=eva(son[o][1],v);
  78. if(d2<d3){
  79. if(d2<ans) query1(son[o][0],v);
  80. if(d3<ans) query1(son[o][1],v);
  81. }else{
  82. if(d3<ans) query1(son[o][1],v);
  83. if(d2<ans) query1(son[o][0],v);
  84. }
  85. }
  86. inline int eva2(int o,point &v){
  87. int res=0;
  88. rep(i,0,1) res+=max(abs(v.x[i]-mn[o].x[i]),abs(v.x[i]-mx[o].x[i]));
  89. return res;
  90. }
  91. void query2(int o,point v){
  92. if(!o) return;
  93. int d1=dis(p[o],v),d2=0,d3=0;
  94. if(d1>ans) ans=d1;
  95. if(son[o][0]) d2=eva2(son[o][0],v);
  96. if(son[o][1]) d3=eva2(son[o][1],v);
  97. if(d2>d3){
  98. if(d2>ans) query2(son[o][0],v);
  99. if(d3>ans) query2(son[o][1],v);
  100. }else{
  101. if(d3>ans) query2(son[o][1],v);
  102. if(d2>ans) query2(son[o][0],v);
  103. }
  104. }
  105. inline ll queryMin(point v){
  106. ans=INF;
  107. query1(root,v);
  108. return ans;
  109. }
  110. inline ll queryMax(point v){
  111. ans=0;
  112. query2(root,v);
  113. return ans;
  114. }
  115. }kd;
  116. int main(){
  117. int n;
  118. while(cin>>n){
  119. kd.init();
  120. rep(i,1,n){
  121. kd.p[i].x[0]=read();
  122. kd.p[i].x[1]=read();
  123. }
  124. kd.root=kd.build(0,1,n);
  125. ll res=INF;
  126. rep(i,1,n){
  127. res=min(res,kd.queryMax(kd.p[i])-kd.queryMin(kd.p[i]));
  128. }
  129. println(res);
  130. }
  131. return 0;
  132. }

BZOJ - 1941 最远估价的更多相关文章

  1. bzoj 1941 Hide and Seek —— K-D树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941 曼哈顿最小距离估价:max( 0, t[x].mn[i] - v.p[i] ) + m ...

  2. BZOJ 1941: [Sdoi2010]Hide and Seek KDtree + 估价函数

    Code: #include<bits/stdc++.h> #define maxn 200000 #define inf 1000000000 using namespace std; ...

  3. bzoj 1941 [Sdoi2010]Hide and Seek——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941 第二道KDtree! 枚举每个点,求出距离它的最远和最近距离.O( n * logn ...

  4. bzoj:1941: [Sdoi2010]Hide and Seek

    1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 531  Solved: 295[Submi ...

  5. BZOJ - 4520 K远点对

    题意:已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对 维护大小为2k最小堆,KD树的估值用前面提到的做法 PS.网上有人估价是使用边界四个点的最值来独立枚举,然而这样写似乎过不了 #incl ...

  6. 【54.08%】【BZOJ 1941】Hide and Seek

    Time Limit: 16 Sec  Memory Limit: 162 MB Submit: 919  Solved: 497 [Submit][Status][Discuss] Descript ...

  7. bzoj 2739 最远点

    Description 给你一个N个点的凸多边形,求离每一个点最远的点. Input 本题有多组数据,第一行一个数T,表示数据组数. 每组数据第一行一个数N,表示凸多边形点的个数,接下来N对数,依次表 ...

  8. BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)

    Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 1712  Solved: 932[Submit][Status][Discuss] Descripti ...

  9. BZOJ - 1941 Hide and Seek (kd树)

    题目链接 kd树模板题,求二维空间上的最远点/最近点. 对所有点建立kd树,分别查询每个点即可.单次查询期望时间复杂度$O(logn)$ #include<bits/stdc++.h> u ...

随机推荐

  1. Opencv图像变成灰度图像、取反图像

    #include <iostream>#include <opencv2/opencv.hpp> using namespace cv;using namespace std; ...

  2. hibernate 一对一(级联关系)

    hibernate 核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hiber ...

  3. django: rest-framework的 分页和过滤

    django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...

  4. 黑盒测试实践-任务进度-Day02

    使用工具 selenium 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 在经过了昨天的基本任务分配之后,今天大家就开始了各自的内容,以下是大家任务的进度情况汇总. 华同学(任务 ...

  5. HDU 4111 Alice and Bob (博弈+记忆化搜索)

    题意:给定 n 堆石头,然后有两种操作,一种是把从任意一堆拿走一个,另一种是把一个石子放到另一堆上. 析:整体看,这个题真是不好做,dp[a][b] 表示有 a 堆1个石子,b个操作,操作是指把其他的 ...

  6. [转]android中最好的瀑布流控件PinterestLikeAdapterView

    PinterestLikeAdapterView 项目地址:https://github.com/GDG-Korea/PinterestLikeAdapterView 使用方法类似于ListView下 ...

  7. wp面试题

    初级工程师 解释什么是依赖属性,它和以前的属性有什么不同?为什么在WPF会使用它? 什么是样式什么是模板 绑定(Binding )的基础用法 解释这几个类的作用及关系: Visual, UIEleme ...

  8. IEnumerable与IQueryable区别

    最近在使用MongoDB的时候,发现查询很慢,一个根据Id查询的语句竟然用了50秒,debug了一下,没发现什么大问题,但是另一个查询的语句只用了2秒,对比了一下,发现50s的那个语句使用的IEnum ...

  9. C# 操作 MongoDB

    今项目使用Mongodb,C#操作MongoDB使用MongoDB.Driver.dll库(Nuget),写了个小Demo,如下: using System; using System.Collect ...

  10. 打开Word 2010 老提示安装 Office single image 2010

    解决办法: WScript.Echo "Try to repair registry key..."  'verify Office version  Set objshell = ...