Hide and Seek bzoj-1941 Sdoi-2010

题目大意:给出平面上n个点,选出一个点,使得距离这个点的最远点曼哈顿距离减去距离这个点的最近非己点的曼哈顿距离最小。输出最小曼哈顿距离差。

注释:$1\le n \le 5\cdot 10^5$。


想法:这个题的话处理方法就是枚举所有点,然后对于每一个点求近邻点和“远”邻点。

其实区别就是估价函数的区别。近邻点对的估价函数就是SJY摆旗子的估价函数

远邻点的话我们就另设一个估价函数,就表示当前点到这个矩形的可能最远曼哈顿距离。也就是矩形的4个顶点中距离当前点曼哈顿距离最远的曼哈顿距离。

然后枚举更新答案即可。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
#define inf 0x7f7f7f7f
using namespace std;
int ans_min,ans_max,root,d;
struct Node
{
int c[2],p[2],maxn[2],minn[2];
}a[N];
inline bool cmp(const Node &a,const Node &b)
{
return a.p[d]==b.p[d]?a.p[d^1]<b.p[d^1]:a.p[d]<b.p[d];
}
void pushup(int k , int s)
{
a[k].minn[0] = min(a[k].minn[0] , a[s].minn[0]);
a[k].minn[1] = min(a[k].minn[1] , a[s].minn[1]);
a[k].maxn[0] = max(a[k].maxn[0] , a[s].maxn[0]);
a[k].maxn[1] = max(a[k].maxn[1] , a[s].maxn[1]);
}
int build(int l , int r , int now)
{
int mid = (l + r) >> 1;
d = now , nth_element(a + l , a + mid , a + r + 1 , cmp);
a[mid].minn[0] = a[mid].maxn[0] = a[mid].p[0];
a[mid].minn[1] = a[mid].maxn[1] = a[mid].p[1];
if(l < mid) a[mid].c[0] = build(l , mid - 1 , now ^ 1) , pushup(mid , a[mid].c[0]);
if(r > mid) a[mid].c[1] = build(mid + 1 , r , now ^ 1) , pushup(mid , a[mid].c[1]);
return mid;
}
int getdis_min(int qx,int qy,int x)
{
int ans=0;
if(qx<a[x].minn[0]) ans+=a[x].minn[0]-qx;
if(qx>a[x].maxn[0]) ans+=qx-a[x].maxn[0];
if(qy<a[x].minn[1]) ans+=a[x].minn[1]-qy;
if(qy>a[x].maxn[1]) ans+=qy-a[x].maxn[1];
return ans;
}
int getdis_max(int qx,int qy,int x)
{
int ans=0;
ans+=max(abs(qx-a[x].minn[0]),abs(qx-a[x].maxn[0]));
ans+=max(abs(qy-a[x].minn[1]),abs(qy-a[x].maxn[1]));
return ans;
}
void query_min(int qx,int qy,int x)
{
int dis_now=abs(qx-a[x].p[0])+abs(qy-a[x].p[1]);
if(dis_now) ans_min=min(dis_now,ans_min);
int ls=a[x].c[0],rs=a[x].c[1];
int dis_l=ls?getdis_min(qx,qy,ls):inf;
int dis_r=rs?getdis_min(qx,qy,rs):inf;
if(dis_l<dis_r)
{
if(ans_min>dis_l) query_min(qx,qy,ls);
if(ans_min>dis_r) query_min(qx,qy,rs);
}
else
{
if(ans_min>dis_r) query_min(qx,qy,rs);
if(ans_min>dis_l) query_min(qx,qy,ls);
}
}
void query_max(int qx,int qy,int x)
{
int dis_now=abs(qx-a[x].p[0])+abs(qy-a[x].p[1]);
ans_max=max(dis_now,ans_max);
int ls=a[x].c[0],rs=a[x].c[1];
int dis_l=ls?getdis_max(qx,qy,ls):0;
int dis_r=rs?getdis_max(qx,qy,rs):0;
if(dis_l>dis_r)
{
if(ans_max<dis_l) query_max(qx,qy,ls);
if(ans_max<dis_r) query_max(qx,qy,rs);
}
else
{
if(ans_max<dis_r) query_max(qx,qy,rs);
if(ans_max<dis_l) query_max(qx,qy,ls);
}
}
int main()
{
int n,ans=inf; cin >> n ;
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].p[0],&a[i].p[1]);
root=build(1,n,1);
for(int i=1;i<=n;i++)
{
ans_min=inf,ans_max=0;
query_min(a[i].p[0],a[i].p[1],root), query_max(a[i].p[0],a[i].p[1],root);
ans=min(ans,ans_max-ans_min);
}
printf("%d\n",ans);
return 0;
}

小结:KD-Tree如果觉得复杂度不对就不对吧,这题就是驶过的。还有,那个tm30秒我还以为是每个店周围的斜正方形之内的点,然后一顿敲就是过不去样例,还没有样例解释...差评!

[bzoj1941][Sdoi2010]Hide and Seek_KD-Tree的更多相关文章

  1. [BZOJ1941][Sdoi2010]Hide and Seek

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

  2. BZOJ1941:[SDOI2010]Hide and Seek(K-D Tree)

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

  3. 【kd-tree】bzoj1941 [Sdoi2010]Hide and Seek

    枚举每个点,计算离他最近的和最远的点. #include<cstdio> #include<cmath> #include<algorithm> using nam ...

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

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

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

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

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

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

  7. 【BZOJ1941】Hide and Seek(KD-Tree)

    [BZOJ1941]Hide and Seek(KD-Tree) 题面 BZOJ 洛谷 题解 \(KD-Tree\)对于每个点搜一下最近点和最远点就好了 #include<iostream> ...

  8. BZOJ_1941_[Sdoi2010]Hide and Seek_KDtree

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

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

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

随机推荐

  1. AngularJS过滤器filter-保留小数-渲染页面-小数点-$filter

    AngularJS      保留小数 默认是保留3位 固定的套路是 {{deom | number:4}} 意思就是保留小数点 的后四位 在渲染页面的时候 加入这儿个代码 用来精确浮点数,指定小数点 ...

  2. 爬虫—Ajax数据爬取

    一.什么是Ajax 有时候我们使用浏览器查看页面正常显示的数据与使用requests抓取页面得到的数据不一致,这是因为requests获取的是原始的HTML文档,而浏览器中的页面是经过JavaScri ...

  3. [ 51Nod 1327 ] 棋盘游戏

    \(\\\) \(Description\) 给出一张\(N\times M\)的棋盘,每个格子最多放置一个棋子,一个合法的放置方案需满足: 每列至多放置一个棋子 对于第\(i\)行,前\(L_i\) ...

  4. html用过标签记录

    nowrap="nowrap" //用于列表中td不许换行 maxlength="100" //用于输入框的长度限制 colspan="2" ...

  5. DataTable And DataRow

    /// <summary> /// 将DataTable的字段名全部翻译为中文 /// </summary> /// <param name="table&qu ...

  6. Showplan 逻辑运算符和物理运算符参考

    本文档已存档,并且将不进行维护. 运算符说明了 SQL Server 如何执行查询或数据操作语言 (DML) 语句. 查询优化器使用运算符生成查询计划,以创建在查询中指定的结果或执行在 DML 语句中 ...

  7. html——行内元素、块元素、行内块元素

    行内元素:span  ,a,  ,strong , em,  del,  ins.特点:在一行上显示:不能直接设置宽高:元素的宽和高就是内容撑开的宽高. 块元素:div,h1-h6,p,ul,li.特 ...

  8. [Windows Server 2008] 手工创建安全网站

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:手工创建安全站 ...

  9. [Windows Server 2012] 安装PHP+MySQL方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:PHP+MyS ...

  10. js 学习笔记---基本概念

    早已接触javascript多年之后,竟然还有这些概念混淆不清,毫不知情,说出来真实无地自容 ! 1.使用严格模式,"use strict",虽然不适用,但是要知道,以免别人使用时 ...