题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941

第二道KDtree!

枚举每个点,求出距离它的最远和最近距离。O( n * logn )。

曼哈顿最小估价:max( 0 , s[ cr ].x[ 0 ] - a[ k ].p[ 0 ] ) + max( 0 , a[ k ].p[ 0 ] - s[ cr ].y[ 0 ] ) + max( 0 , s[ cr ].x[ 1 ] - a[ k ].p[ 1 ] ) + max( 0 , a[ k ].p[ 1 ] - s[ cr ].y[ 1 ] ) 。

曼哈顿最大估价:max( abs( s[ cr ].x[ 0 ] - a[ k ].p[ 0 ] ) , abs( a[ k ].p[ 0 ] - s[ cr ].y[ 0 ] ) ) + max( abs( s[ cr ].x[ 1 ] - a[ k ].p[ 1 ] ) , abs( a[ k ].p[ 1 ] - s[ cr ].y[ 1 ] ) ) 。

  (其中0、1表示横坐标、纵坐标,x、y表示最小、最大)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e5+,INF=0x3f3f3f3f;
int n,rt,ans=INF,fx,tot,mx,mn;
struct Dt{
int x[],y[],p[],ly;//x:min y:max p:ps
}a[N];
bool cmp(Dt u,Dt v){return u.p[fx]<v.p[fx];}
struct KD{
int c[N][],q;Dt s[N];
void add(int cr,int k)
{ for(int i=;i<=;i++)
s[cr].x[i]=s[cr].y[i]=s[cr].p[i]=a[k].p[i], s[cr].ly=k; }
void pshp(int cr)
{
int ls=c[cr][],rs=c[cr][];
for(int i=;i<=;i++)
{
if(ls) s[cr].x[i]=min(s[cr].x[i],s[ls].x[i]),
s[cr].y[i]=max(s[cr].y[i],s[ls].y[i]);
if(rs) s[cr].x[i]=min(s[cr].x[i],s[rs].x[i]),
s[cr].y[i]=max(s[cr].y[i],s[rs].y[i]);
}
}
void build(int &cr,int l,int r,bool now)
{
int mid=l+r>>; fx=now; nth_element(a+l,a+mid,a+r+,cmp);
cr=++tot; add(cr,mid);
if(l<mid) build(c[cr][],l,mid-,!now);
if(mid<r) build(c[cr][],mid+,r,!now);
pshp(cr);
}
int distx(int cr,int k)
{
int ret=;
for(int i=;i<=;i++)
ret+=max(abs(s[cr].x[i]-a[k].p[i]),abs(a[k].p[i]-s[cr].y[i]));
return ret;
}
int distn(int cr,int k)
{
int ret=;
for(int i=;i<=;i++)
ret+=max(,s[cr].x[i]-a[k].p[i])+max(,a[k].p[i]-s[cr].y[i]);
return ret;
}
int dis(Dt u,Dt v){return abs(u.p[]-v.p[])+abs(u.p[]-v.p[]);}
void queryx(int cr,int l,int r)
{
mx=max(mx,dis(s[cr],a[q]));
int ls=c[cr][], rs=c[cr][], mid=l+r>>;
int dl=(ls?distx(ls,q):-INF), dr=(rs?distx(rs,q):-INF);
if(dl>dr)
{ if(dl>mx) queryx(ls,l,mid-); if(dr>mx) queryx(rs,mid+,r);}
else
{ if(dr>mx) queryx(rs,mid+,r); if(dl>mx) queryx(ls,l,mid-);}
}
void queryn(int cr,int l,int r)
{
if(s[cr].ly!=q) mn=min(mn,dis(s[cr],a[q]));
int ls=c[cr][], rs=c[cr][], mid=l+r>>;
int dl=(ls?distn(ls,q):INF), dr=(rs?distn(rs,q):INF);
if(dl<dr)
{ if(dl<mn) queryn(ls,l,mid-); if(dr<mn) queryn(rs,mid+,r);}
else
{ if(dr<mn) queryn(rs,mid+,r); if(dl<mn) queryn(ls,l,mid-);}
}
}kd;
int rdn()
{
int ret=; char ch=getchar();
while(ch>''||ch<'')ch=getchar();
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return ret;
}
int main()
{
n=rdn();
for(int i=;i<=n;i++)
a[i].p[]=rdn(),a[i].p[]=rdn();
kd.build(rt,,n,);
for(int i=,t1,t2;i<=n;i++)
{
kd.q=i; mx=-INF; mn=INF;
kd.queryx(rt,,n); kd.queryn(rt,,n);
ans=min(ans,mx-mn);
// printf("ans=%d i=%d mx=%d mn=%d\n",ans,i,mx,mn);
}
printf("%d\n",ans);
return ;
}

bzoj 1941 [Sdoi2010]Hide and Seek——KDtree的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ1941】[Sdoi2010]Hide and Seek KDtree

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

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

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

  6. 【bzoj1941】[Sdoi2010]Hide and Seek KD-tree

    题目描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. ...

  7. 【BZOJ-1941】Hide and Seek KD-Tree

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

  8. [BZOJ1941][Sdoi2010]Hide and Seek

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

  9. 【bzoj1941】[Sdoi2010]Hide and Seek(kd-tree)

    bzoj 题意: 给出\(n\)个点,对于每个点,\(d_i\)等于距离其最远的点的距离减去距离最近的点的距离.这里的距离为曼哈顿距离. 求\(min\{d_i\}\). 思路: 考虑直接对每个点暴力 ...

随机推荐

  1. POJ 2993 Emag eht htiw Em Pleh【模拟画棋盘】

    链接: http://poj.org/problem?id=2993 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27454#probl ...

  2. 修改maven的war包生成路径

    因为要配合jenkins,所以控制了war包的生成目录: <plugins> <!--打war包到指定的目录下 --> <plugin> <groupId&g ...

  3. 洛谷 2216 [HAOI2007]理想的正方形

    题目戳这里 一句话题意 给你一个a×b的矩形,求一个n×n的子矩阵,矩阵里面的最大值和最小值之差最小. Solution 这个题目许多大佬都是单调队列,但是我不是很会,只好用了比较傻逼的方法: 首先我 ...

  4. Linux c编程:线程属性

    前面介绍了pthread_create函数,并且当时的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结构的指针.可以使用pthread_attr_t结构修改线程默认属性,并把这些 ...

  5. Tensorflow官方文档中文版——第二章(瞎奖杯写)

    包含如下几个部分: 1.面向机器学习初学者的 MNIST 初级教程 2.面向机器学习专家的 MNIST 高级教程 3.TensorFlow 使用指南 4.卷积神经网络 5.单词的向量表示(word e ...

  6. scala如何解决类型强转问题

    scala如何解决类型强转问题 scala属于强类型语言,在指定变量类型时必须确定数据类型,即便scala拥有引以为傲的隐式推到,这某些场合也有些有心无力. 例如: java同属强类型语言,但java ...

  7. Android SDK上手指南1:应用程序结构

    一直说要学java要学android开发,可是一直胡乱地忙活这忙活那,之前开始学了一点也中断了.说是没时间,都是借口,回顾一下自己的生活感觉缺少点激情,没有什么奋斗的动力,所以好多时间就浪费了.刚刚考 ...

  8. Data Structure Binary Tree: Largest Independent Set Problem

    http://www.geeksforgeeks.org/largest-independent-set-problem/ #include <iostream> #include < ...

  9. 模块化(CommonJs、AMD、CMD、UMD)发展历史与优缺点

    全文主要整理自摘自<Webpack中文指南>(好文,建议直接去看,以下仅对该系列文章中的<历史发展>篇幅进行备份——也整理了点其他内容) 模块化 模块化是老生常谈了,这里不做阐 ...

  10. 《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点

    题目 例如 1-2-3-4 删除2,1-2-3-4-5 删除3 例如 a=1,b =2 java代码 /** * @Description:删除中间节点和a/b处节点 * @Author: lizho ...