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

曼哈顿最小距离估价:max( 0, t[x].mn[i] - v.p[i] ) + max( 0, v.p[i] - t[x].mx[i] ),可理解为到边界;

曼哈顿最大距离估价:max( abs( t[x].mn[i] - v.p[i] ) + abs( t[x].mx[i] - v.p[i] ) ),可理解为到顶点;

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
int const xn=5e5+,inf=1e9;
int n,ans,rt,dm,cnt,c[xn][],mx,mn;
struct N{int mn[],mx[],p[],id;}a[xn],t[xn<<];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int Abs(int x){return x>?x:-x;}
int Min(int x,int y){return x<y?x:y;}
int Max(int x,int y){return x<y?y:x;}
bool cmp(N x,N y){return x.p[dm]<y.p[dm];}
void turn(int x,N v){for(int i=;i<;i++)t[x].mn[i]=t[x].mx[i]=t[x].p[i]=v.p[i];}
void pushup(int x)
{
int ls=c[x][],rs=c[x][];
for(int i=;i<;i++)
{
if(ls)t[x].mn[i]=Min(t[x].mn[i],t[ls].mn[i]),t[x].mx[i]=Max(t[x].mx[i],t[ls].mx[i]);
if(rs)t[x].mn[i]=Min(t[x].mn[i],t[rs].mn[i]),t[x].mx[i]=Max(t[x].mx[i],t[rs].mx[i]);
}
}
void build(int &x,int l,int r,int nw)
{
x=++cnt; dm=nw;
nth_element(a+l,a+mid,a+r+,cmp);
turn(x,a[mid]); t[x].id=mid;
if(mid>l)build(c[x][],l,mid-,nw^);
if(mid<r)build(c[x][],mid+,r,nw^);
pushup(x);
}
int dis(int x,N v)
{
int ret=;
for(int i=;i<;i++)
ret+=Max(Abs(t[x].mn[i]-v.p[i]),Abs(t[x].mx[i]-v.p[i]));
return ret;
}
void querymx(int x,N v)
{
mx=Max(mx,Abs(t[x].p[]-v.p[])+Abs(t[x].p[]-v.p[]));
int dl=(c[x][]?dis(c[x][],v):),dr=(c[x][]?dis(c[x][],v):);
if(dl>=dr){if(dl>mx)querymx(c[x][],v); if(dr>mx)querymx(c[x][],v);}
else {if(dr>mx)querymx(c[x][],v); if(dl>mx)querymx(c[x][],v);}
}
int dis2(int x,N v)
{
int ret=;
for(int i=;i<;i++)
ret+=Max(,t[x].mn[i]-v.p[i]),ret+=Max(,v.p[i]-t[x].mx[i]);
return ret;
}
void querymn(int x,N v,int q)
{
if(t[x].id!=q)mn=Min(mn,Abs(t[x].p[]-v.p[])+Abs(t[x].p[]-v.p[]));
int dl=(c[x][]?dis2(c[x][],v):inf),dr=(c[x][]?dis2(c[x][],v):inf);
if(dl<=dr){if(dl<mn)querymn(c[x][],v,q); if(dr<mn)querymn(c[x][],v,q);}
else {if(dr<mn)querymn(c[x][],v,q); if(dl<mn)querymn(c[x][],v,q);}
}
int main()
{
n=rd();
for(int i=;i<=n;i++)a[i].p[]=rd(),a[i].p[]=rd();
build(rt,,n,); ans=inf;
for(int i=;i<=n;i++)
{
mx=; mn=inf;
querymx(rt,a[i]); querymn(rt,a[i],i);
ans=Min(ans,mx-mn);
}
printf("%d\n",ans);
return ;
}

最新文章

  1. C#后台调用公网接口(GET, POST)
  2. 为什么xcode7请求不成功
  3. PowerDesigner 15.2入门学习 二
  4. D&amp;F学数据结构系列——二叉排序树
  5. BZOJ 3288 Mato矩阵 解题报告
  6. 队列工厂之RabbitMQ
  7. C# Socket编程笔记(自己看,转载)
  8. log4j2配置文件解读
  9. 机器学习之决策树(ID3 、C4.5算法)
  10. if(){}使用
  11. Python学习笔记五
  12. 【转载】 什么是AutoML
  13. 微信小程序自运营器 微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营)
  14. [Intellij] 在IntelliJ IDEA 中创建运行web项目
  15. PM2.5环境检测系统的设计与分析
  16. xmpp实现的即时通讯聊天(二)
  17. window环境下使用sbt编译spark源码
  18. JavaScript权威指南--Javascript子集和扩展
  19. 小米手机不能直接运行Android Studio程序
  20. jquery动画切换引擎插件 Velocity.js 学习02

热门文章

  1. Eclipse下使用maven搭建多模块项目
  2. JVM相关的几个基本概念
  3. 分析DNS解析时间
  4. HDU - 2709 Sumsets 【递推】
  5. STM32大文件分块校验CRC
  6. 如何在unigui中用代码展开一棵树?
  7. Python基础-MD5加密
  8. 百度编辑器UEditor配置toolbars工具条功能按钮
  9. leetcode 162 Find Peak Element(二分法)
  10. 大白话AOP