http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接)

题意

  给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小。

Solution

  KDtree板子,早就听jump说KDtree都是板子题→_→

  枚举点,求其最远点距离和最近点距离,更新答案。最远邻近域搜索跟最近差不多,就是把估价函数改一下。

细节

  码农题注意细节

代码

// bzoj1941
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 1<<30
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=1000010,maxm=2;
int n,K,ans1,ans2,rt; struct KDtree {
int v[maxm],mn[maxm],mx[maxm],l,r;
friend bool operator < (const KDtree a,const KDtree b) {
return a.v[K]<b.v[K];
}
}tr[maxn],S; int dis(KDtree a,KDtree b) {
int res=0;
for (int i=0;i<=1;i++) res+=abs(a.v[i]-b.v[i]);
return res;
}
int eva1(int k) {
if (!k) return inf;
int res=0;
for (int i=0;i<=1;i++) res+=max(0,S.v[i]-tr[k].mx[i])+max(0,tr[k].mn[i]-S.v[i]);
return res;
}
int eva2(int k) {
if (!k) return 0;
int res=0;
for (int i=0;i<=1;i++) res+=max(tr[k].mx[i]-S.v[i],S.v[i]-tr[k].mn[i]);
return res;
} void update(int k) {
if (tr[k].l)
for (int i=0;i<=1;i++) {
tr[k].mx[i]=max(tr[k].mx[i],tr[tr[k].l].mx[i]);
tr[k].mn[i]=min(tr[k].mn[i],tr[tr[k].l].mn[i]);
}
if (tr[k].r)
for (int i=0;i<=1;i++) {
tr[k].mx[i]=max(tr[k].mx[i],tr[tr[k].r].mx[i]);
tr[k].mn[i]=min(tr[k].mn[i],tr[tr[k].r].mn[i]);
}
}
int build(int l,int r,int p) {
K=p;
int mid=(l+r)>>1;
nth_element(tr+l,tr+mid,tr+r+1);
for (int i=0;i<=1;i++) tr[mid].mn[i]=tr[mid].mx[i]=tr[mid].v[i];
if (l<mid) tr[mid].l=build(l,mid-1,p^1);
if (mid<r) tr[mid].r=build(mid+1,r,p^1);
update(mid);
return mid;
}
void query1(int k) {
if (S.v[0]!=tr[k].v[0] || S.v[1]!=tr[k].v[1]) ans1=min(ans1,dis(S,tr[k]));
int dl=eva1(tr[k].l),dr=eva1(tr[k].r);
if (dl<dr) {
if (dl<ans1) query1(tr[k].l);
if (dr<ans1) query1(tr[k].r);
}
else {
if (dr<ans1) query1(tr[k].r);
if (dl<ans1) query1(tr[k].l);
}
}
void query2(int k) {
ans2=max(ans2,dis(S,tr[k]));
int dl=eva2(tr[k].l),dr=eva2(tr[k].r);
if (dl>dr) {
if (dl>ans2) query2(tr[k].l);
if (dr>ans2) query2(tr[k].r);
}
else {
if (dr>ans2) query2(tr[k].r);
if (dl>ans2) query2(tr[k].l);
}
}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d%d",&tr[i].v[0],&tr[i].v[1]);
rt=build(1,n,0);
int ans=inf;
for (int i=1;i<=n;i++) {
S=tr[i];
ans1=inf;query1(rt); //最小
ans2=0;query2(rt); //最大
ans=min(ans,ans2-ans1);
}
printf("%d",ans);
return 0;
}

【bzoj1941】 Sdoi2010—Hide and Seek的更多相关文章

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

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

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

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

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

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

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

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

  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. [BZOJ1941][Sdoi2010]Hide and Seek

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

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

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

  8. 【BZOJ1925】[SDOI2010]地精部落(动态规划)

    [BZOJ1925][SDOI2010]地精部落(动态规划) 题面 BZOJ 洛谷 题解 一道性质\(dp\)题.(所以当然是照搬学长PPT了啊 先来罗列性质,我们称题目所求的序列为抖动序列: 一个抖 ...

  9. 【BZOJ1951】[SDOI2010]古代猪文

    [BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...

随机推荐

  1. springmvc4 mybatis 整合 框架源码 bootstrap

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

  2. 什么是WebPack,为什么要使用它?

    1.什么是Webpack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等) ...

  3. 漫谈Nuclear Web组件化入门篇

    目前来看,团队内部前端项目已全面实施组件化开发.组件化的好处太多,如:按需加载.可复用.易维护.可扩展.少挖坑.不改组件代码直接切成服务器端渲染(如Nuclear组件化可以做到,大家叫同构)... 怎 ...

  4. [deviceone开发]-do_Album的简单示例

    一.简介do_Album用来打开手机系统提供的相册,能选择一张或多张图片返回给开发者,通常相册的图片比较大,要经过缩放.有的时候用户也需要把别的地方获取到到图片收藏到系统相册.这个示例简单展示这个组件 ...

  5. jQuery动画与特效详解

    本文主要是讲解和学习jQuery的自动显隐,渐入渐出等. 1.显示和隐藏hide()和show() 对于动画来说,显示和隐藏是最基本的效果之一,本节简单介绍jQuery的显示和隐藏. 代码如下: &l ...

  6. 记录我的点点滴滴从此刻做起——iOS开发工程师

    作为一个iOS工程师,想写博客也是有原因的:首先有这个想法(写博客的想法)也是因为想到自己都从事iOS开发快两年了,怎么也只会堆代码,写view,技术真的很一般,感觉都要被淘汰了:基于以上原因,自己也 ...

  7. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  8. ddd 聚合根 之 聚合与不聚合 设计

    聚合 不聚合 订单和订单明细 论坛主贴与贴子回复 订单和收货地址(vo)  

  9. 怎么修改与设置.jsp文件属性?

    1.首先  打开  >>  Myeclipse或Eclipse.(我用的是Myeclipse) 2.打开  >>  Window  >>  Preferences  ...

  10. Linux基础练习题(三)

    1.显示当前系统上root.fedora或user1用户的默认shell: [root@www ~]# egrep "^(root|fedora|user1)" /etc/pass ...