https://www.luogu.org/problemnew/show/P2479

据说可以用线段树做但是我不会,只能写一个 KD-Tree 了

对于每个点求出距离它最远的点和最近的点的距离,然后取 min 即可

因为这个东西是可以剪枝的,所以跑的挺快的

#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
using namespace std;typedef unsigned long long ull;
typedef long long ll;template <typename _T>
inline void read(_T &f) {f = 0; _T fu = 1; char c = getchar();while(c < '0' || c > '9') {if(c == '-') fu = -1; c = getchar();}while(c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + (c & 15); c = getchar();}f *= fu;
}const int N = 1e5 + 5;int WD, siz, n, root;struct po {int a[2];bool operator < (const po A) const {return a[WD] < A.a[WD];}
}t[N];struct Node {int mn[2], mx[2], lc, rc;po tp;
}p[N];void update(int u) {int l = p[u].lc, r = p[u].rc;for(register int i = 0; i <= 1; i++) {p[u].mn[i] = p[u].mx[i] = p[u].tp.a[i];if(l) p[u].mn[i] = min(p[u].mn[i], p[l].mn[i]), p[u].mx[i] = max(p[u].mx[i], p[l].mx[i]);if(r) p[u].mn[i] = min(p[u].mn[i], p[r].mn[i]), p[u].mx[i] = max(p[u].mx[i], p[r].mx[i]);}
}int build(int l, int r, int wd) {if(l > r) return 0;int u = ++siz, mid = (l + r) >> 1;WD = wd; nth_element(t + l, t + mid, t + r + 1);p[u].tp = t[mid]; p[u].lc = build(l, mid - 1, wd ^ 1); p[u].rc = build(mid + 1, r, wd ^ 1);update(u); return u;
}// 最小距离
int calc1(int u, po tp) {int ans = 0;for(register int i = 0; i <= 1; i++) ans += max(0, p[u].mn[i] - tp.a[i]) + max(0, tp.a[i] - p[u].mx[i]);return ans;
}int calc2(int u, po tp) {int ans = 0;for(register int i = 0; i <= 1; i++) ans += max(abs(tp.a[i] - p[u].mn[i]), abs(tp.a[i] - p[u].mx[i]));return ans;
}int dis(po a, po b) {int ans = 0;for(register int i = 0; i <= 1; i++) ans += abs(a.a[i] - b.a[i]);return ans;
}const int INF = 0x7f7f7f7f;
int ans1, ans2;void query1(int u, po tp) {if(!u) return;int now = dis(p[u].tp, tp);if(ans1 > now && now) ans1 = now;int l = INF, r = INF;if(p[u].lc) l = calc1(p[u].lc, tp);if(p[u].rc) r = calc1(p[u].rc, tp);if(l < r) {if(l < ans1) query1(p[u].lc, tp);if(r < ans1) query1(p[u].rc, tp);} else {if(r < ans1) query1(p[u].rc, tp);if(l < ans1) query1(p[u].lc, tp);}
}void query2(int u, po tp) {if(!u) return;int now = dis(p[u].tp, tp);if(ans2 < now) ans2 = now;int l = -1, r = -1;if(p[u].lc) l = calc2(p[u].lc, tp);if(p[u].rc) r = calc2(p[u].rc, tp);if(l > r) {if(l > ans2) query2(p[u].lc, tp);if(r > ans2) query2(p[u].rc, tp);} else {if(r > ans2) query2(p[u].rc, tp);if(l > ans2) query2(p[u].lc, tp);}
}int minn = INF;int main() {cin >> n;for(register int i = 1; i <= n; i++) read(t[i].a[0]), read(t[i].a[1]);root = build(1, n, 0);for(register int i = 1; i <= n; i++) {ans1 = INF, ans2 = -INF;query1(root, t[i]);query2(root, t[i]);minn = min(minn, ans2 - ans1);}cout << minn << endl;return 0;
}

转载于:https://www.cnblogs.com/LJC00118/p/9747746.html

luoguP2479 [SDOI2010]捉迷藏相关推荐

  1. P2479 [SDOI2010]捉迷藏

    传送门 KDtree是个吼东西啊-- 枚举每一个点,然后求出离他距离最远和最近的点的距离,更新答案 然而为什么感觉KDtree只是因为剪枝才能跑得动呢-- //minamoto #include< ...

  2. 省选+NOI 第五部分 高级数据结构

    左偏树 [AgOHの数据结构]左偏树 [AgOHの数据结构]左偏树_哔哩哔哩_bilibili CSU-ICPC集训课程 启发式合并和左偏树 CSU-ICPC集训课程 启发式合并和左偏树_哔哩哔哩_b ...

  3. BZOJ 1923: [Sdoi2010]外星千足虫

    1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 921  Solved: 592 [Submit][Stat ...

  4. bzoj1927: [Sdoi2010]星际竞速

    跟上一题几乎一样... #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  5. 清华吴翼:从捉迷藏游戏说起,谈谈强化学习的六个开放问题

    第九届国际学习表征大会(ICLR 2021)是深度学习领域的国际顶级会议.在正式会议召开之前,青源Seminar于2月19日-21日成功召开了ICLR 2021 中国预讲会.回放链接:hub.baai ...

  6. 论坛报名 | 从捉迷藏、星际争霸到新一代人工智能:多智能体深度强化学习的理论与实践...

    与6位图灵奖得主和100多位专家 共同探讨人工智能的下一个十年 长按图片或点击阅读原文,内行盛会,首次免费注册 2020年6月21-24日,第二届北京智源大会(官网:https://2020.baai ...

  7. bzoj 1095: [ZJOI2007]Hide 捉迷藏

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  8. 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)

    1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游 ...

  9. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

    Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...

最新文章

  1. 坦克世界服务器未响应怎么解决,华硕笔记本老是程序未响应怎么处理
  2. 第四章 Lync server 2010的安装
  3. Pycharm中导入的模块名下出现红色波浪线问题
  4. 这一新的可视化方法教你优雅地探索相关性
  5. 求两个数之间的水仙花数.c语言,求水仙花数(C语言/Java)
  6. android 接百度SDK遇到的坑(百度地图BD09经纬度转高德地图GCJ02经纬度)
  7. vlan理论03-vlan映射
  8. 三菱PLC基础知识 辅助继电器M
  9. linux team 模式,linux 聚合口 team libteam 简介
  10. 新车 合格证 二维码 解密
  11. ArcGIS 教程:Workflow Manager 高速浏览
  12. 【安装】win7 64位安装sql server2005图文教程
  13. 软件工程师之路-软考(中级)1
  14. 建站用阿里云还是腾讯云好?
  15. Stanford iOS7 Lecture 1-3 demo
  16. 台式计算机的8g,win10系统台式机配置8G内存显示可用内存只有3.4G的教程
  17. 如何使用Excel管理项目?
  18. Java Swing入门基础
  19. 发现一个很神奇的现象,求大神解释
  20. 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)

热门文章

  1. Python 输入和输出
  2. IE相关的一些BUG汇总
  3. SQLServer的数据类型
  4. 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...
  5. TP5部署服务器问题总结
  6. oracle10g总结
  7. ITTC数据挖掘平台介绍(四) 框架改进和新功能
  8. Cacti Weathermap 高级用法 (二)
  9. 谷歌官方扩展UI组件---SlideTabLayout
  10. android Fragment 学习资料推荐