[BZOJ1941][SDOI2010]Hide and Seek(线段树)
来源:互联网 发布:关系型数据库基本特征 编辑:程序博客网 时间:2024/06/04 20:10
可以发现,对于任意两点
首先按照
同时,上面的操作只能算出一个点与其左下角的点的最短和最长距离。所以上面的操作要做
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define p2 p << 1#define p3 p << 1 | 1using namespace std;inline int read() { int res = 0; bool bo = 0; char c; while (((c = getchar()) < '0' || c > '9') && c != '-'); if (c == '-') bo = 1; else res = c - 48; while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + (c - 48); return bo ? ~res + 1 : res;}const int N = 1e5 + 5, INF = 0x3f3f3f3f;int n, Max[N << 2], Min[N << 2], disMax[N], disMin[N];struct cyx {int x, y, u, v, id;} a[N];bool comp1(cyx a, cyx b) { if (a.x != b.x) return a.x < b.x; return a.y < b.y;}bool comp2(cyx a, cyx b) { if (a.y != b.y) return a.y < b.y; return a.x < b.x;}void build(int l, int r, int p) { if (l == r) {Max[p] = -INF; Min[p] = INF; return;} int mid = l + r >> 1; build(l, mid, p2); build(mid + 1, r, p3); Max[p] = -INF; Min[p] = INF;}void change(int l, int r, int pos, int v, int p) { if (l == r) {Max[p] = max(Max[p], v); Min[p] = min(Min[p], v); return;} int mid = l + r >> 1; if (pos <= mid) change(l, mid, pos, v, p2); else change(mid + 1, r, pos, v, p3); Max[p] = max(Max[p2], Max[p3]); Min[p] = min(Min[p2], Min[p3]);}int queryMax(int l, int r, int s, int e, int p) { if (l == s && r == e) return Max[p]; int mid = l + r >> 1, res; if (e <= mid) res = queryMax(l, mid, s, e, p2); else if (s >= mid + 1) res = queryMax(mid + 1, r, s, e, p3); else res = max(queryMax(l, mid, s, mid, p2), queryMax(mid + 1, r, mid + 1, e, p3)); return res;}int queryMin(int l, int r, int s, int e, int p) { if (l == s && r == e) return Min[p]; int mid = l + r >> 1, res; if (e <= mid) res = queryMin(l, mid, s, e, p2); else if (s >= mid + 1) res = queryMin(mid + 1, r, s, e, p3); else res = min(queryMin(l, mid, s, mid, p2), queryMin(mid + 1, r, mid + 1, e, p3)); return res;}void solve() { int i; build(1, 1e5, 1); for (i = 1; i <= n; i++) { int maxd = a[i].x + a[i].y - queryMin(1, 1e5, 1, a[i].v, 1), mind; mind = a[i].x + a[i].y - queryMax(1, 1e5, 1, a[i].v, 1); change(1, 1e5, a[i].v, a[i].x + a[i].y, 1); disMax[a[i].id] = max(disMax[a[i].id], maxd); disMin[a[i].id] = min(disMin[a[i].id], mind); }}void init() { int i, tot = 0; sort(a + 1, a + n + 1, comp2); for (i = 1; i <= n; i++) { if (i == 1 || a[i].y != a[i - 1].y) tot++; a[i].v = tot; } tot = 0; sort(a + 1, a + n + 1, comp1); for (i = 1; i <= n; i++) { if (i == 1 || a[i].x != a[i - 1].x) tot++; a[i].u = tot; }}int main() { int i, j, res = INF; n = read(); for (i = 1; i <= n; i++) a[i].x = read() + 1, a[i].y = read() + 1, a[i].id = i; for (i = 1; i <= n; i++) disMax[i] = -INF, disMin[i] = INF; for (j = 1; j <= 4; j++) { init(); solve(); for (i = 1; i <= n; i++) swap(a[i].x, a[i].y), a[i].x = 13e7 - a[i].x + 1; } for (i = 1; i <= n; i++) res = min(res, disMax[i] - disMin[i]); return printf("%d\n", res), 0;}
阅读全文
0 0
- [BZOJ1941][SDOI2010]Hide and Seek(线段树)
- 【bzoj1941】【sdoi2010】【Hide and Seek】【kd树】
- [BZOJ1941][Sdoi2010]Hide and Seek
- [bzoj1941][SDOI2010]Hide and Seek
- 【SDOI2010】【BZOJ1941】Hide and Seek
- bzoj1941: [Sdoi2010]Hide and Seek
- 【SDOI2010】bzoj1941 Hide and Seek
- 【bzoj1941】[Sdoi2010]Hide and Seek
- bzoj1941 [Sdoi2010]Hide and Seek
- [BZOJ1941][Sdoi2010]Hide and Seek(kd-tree)
- [BZOJ1941][Sdoi2010]Hide and Seek(KD-tree)
- bzoj1941: [Sdoi2010]Hide and Seek KD-tree
- BZOJ1941: [Sdoi2010]Hide and Seek kdtree
- 【BZOJ1941】【SDOI2010】Hide and Seek、KDTree【数组版】 模板、
- Bzoj1941:[Sdoi2010]Hide and Seek:K-D-Tree
- 1941: [Sdoi2010]Hide and Seek|动态加点线段树
- bzoj1941 Hide and Seek(kd_Tree模板题)
- [bzoj1941][kd-tree]Hide and Seek
- 使用ajax实现登录业务
- NOIP2016天天爱跑步 题解报告【lca+树上统计(桶)】
- 为防止递归递推时栈溢出
- eclipse创建MAVEN项目是出现Could not resolve archetype的解决办法
- java类与对象,方法
- [BZOJ1941][SDOI2010]Hide and Seek(线段树)
- C++成员变量的初始化顺序问题
- malloc/free 和 new/delete 区别
- Hadoop最简单的介绍
- 进程和线程的区别
- 设计模式之单例模式
- 如何写SysV服务管理脚本
- 2018网易游戏笔试题
- 边缘检测:Sobel算子