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

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

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
using namespace std;
const int MAXN = 5e5+11;
const int INF = 0x7fffffff;
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int D;
struct point{
int x[2];
bool operator < (const point &rhs) const{
return x[D]<rhs.x[D];
}
};
struct KD{
int son[MAXN][2];
point p[MAXN],mn[MAXN],mx[MAXN];
int root,ans,tot;
void init(){
ans=INF; tot=D=0;
}
void pu(int o){
rep(i,0,1){
if(son[o][i]) rep(j,0,1){
if(mn[son[o][i]].x[j]<mn[o].x[j]) mn[o].x[j]=mn[son[o][i]].x[j];
if(mx[son[o][i]].x[j]>mx[o].x[j]) mx[o].x[j]=mx[son[o][i]].x[j];
}
}
}
int build(int now,int l,int r){
int mid=l+r>>1;
tot++; son[mid][0]=son[mid][1]=0;
D=now;nth_element(p+l,p+mid,p+r+1);//[l,r+1)
mn[mid].x[0]=mx[mid].x[0]=p[mid].x[0];
mn[mid].x[1]=mx[mid].x[1]=p[mid].x[1];
if(l<mid) son[mid][0]=build(now^1,l,mid-1);
if(r>mid) son[mid][1]=build(now^1,mid+1,r);
pu(mid);
return mid;
}
void insert(int &o,int now,point v){
if(!o){
o=++tot;
p[o].x[0]=mn[o].x[0]=mx[o].x[0]=v.x[0];
p[o].x[1]=mn[o].x[1]=mx[o].x[1]=v.x[1];
}else{
insert(son[o][p[o].x[now]<v.x[now]],now^1,v);
pu(o);
}
}
inline int dis(point &a,point &b){
return abs(a.x[0]-b.x[0])+abs(a.x[1]-b.x[1]);
}
inline int eva(int o,point &v){
int res=0;
rep(i,0,1) if(v.x[i]<mn[o].x[i]||v.x[i]>mx[o].x[i]){
if(v.x[i]<mn[o].x[i]) res+=mn[o].x[i]-v.x[i];
else res+=v.x[i]-mx[o].x[i];
}
return res;
}
void query1(int o,point v){
if(!o) return;
int d1=dis(p[o],v),d2=INF,d3=INF;
if(d1<ans&&d1!=0) ans=d1;
if(son[o][0]) d2=eva(son[o][0],v);
if(son[o][1]) d3=eva(son[o][1],v);
if(d2<d3){
if(d2<ans) query1(son[o][0],v);
if(d3<ans) query1(son[o][1],v);
}else{
if(d3<ans) query1(son[o][1],v);
if(d2<ans) query1(son[o][0],v);
}
}
inline int eva2(int o,point &v){
int res=0;
rep(i,0,1) res+=max(abs(v.x[i]-mn[o].x[i]),abs(v.x[i]-mx[o].x[i]));
return res;
}
void query2(int o,point v){
if(!o) return;
int d1=dis(p[o],v),d2=0,d3=0;
if(d1>ans) ans=d1;
if(son[o][0]) d2=eva2(son[o][0],v);
if(son[o][1]) d3=eva2(son[o][1],v);
if(d2>d3){
if(d2>ans) query2(son[o][0],v);
if(d3>ans) query2(son[o][1],v);
}else{
if(d3>ans) query2(son[o][1],v);
if(d2>ans) query2(son[o][0],v);
}
}
inline ll queryMin(point v){
ans=INF;
query1(root,v);
return ans;
}
inline ll queryMax(point v){
ans=0;
query2(root,v);
return ans;
}
}kd;
int main(){
int n;
while(cin>>n){
kd.init();
rep(i,1,n){
kd.p[i].x[0]=read();
kd.p[i].x[1]=read();
}
kd.root=kd.build(0,1,n);
ll res=INF;
rep(i,1,n){
res=min(res,kd.queryMax(kd.p[i])-kd.queryMin(kd.p[i]));
}
println(res);
}
return 0;
}

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. sqlserver临时表或表变量代替游标

    在很多场合,用临时表或表变量也可以替代游标 临时表用在表没有标识列(int)的情况下. 在表有标识列(int)的情况下可以用表变量,当然也可以用临时表. 利用临时表或表变量的原因时,生成一个连续的列 ...

  2. 手打的table

    突然觉得,如果我不上传源码和写篇博客,对不起花在这个破网页2个小时的时间,完全手打,浏览器调效果. 源码如下: a.html: <!DOCTYPE html PUBLIC "-//W3 ...

  3. 二度Xml<2>

    一下介绍xml的基本操作,添加xml新节点: 其他方法在前一篇日记中有详细讲解,请详见:http://www.cnblogs.com/fjsnail/archive/2012/10/20/273212 ...

  4. (11)Web程序保存状态的几种方式,Application,Session,Cookie,ViewState

    WEb程序保存状态的方式有这样几种: 1.Application:保存在Application中的数据是全局有效的:Application里面存放的应该是访问多修      改较少并且是全局至少大部分 ...

  5. java实现wc功能

    github项目地址:https://github.com/3216004717/ruanjiangongcheng.git 项目相关要求 基本要求 wc.exe -c file.c //返回文件 f ...

  6. Bitmap类、BitmapFactory及BitmapFactory类中的常用方法

    1.Bitmap 1.1非静态方法 public void recycle()——回收位图占用的内存空间,把位图标记为Dead public final boolean isRecycled() —— ...

  7. laravel中chunk方法使用外部变量以及改变该变量

  8. C# 调接口

    上一个项目,需要mvc管理后台调接口项目,以便后期的重构扩展,调研后发现后台用的ajax请求,直接调接口可能会有跨域问题,最终在c#代码中实现了这个需求. 1,Ajax请求后台 将接口所需参数传入 2 ...

  9. Android 学习笔记 文本文件的读写操作

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  10. 标准库函数begin和end------c++primer

    尽管能计算得到尾后指针,但这种用法极易出错.为了让指针的使用更简单.更安全,c++新标准引入了两个名为begin和end的函数.这两个函数与容器中的两个同名成员功能类似,不过数组毕竟不是类类型,因此这 ...