1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| #include <bits/stdc++.h>
#define debug(x) cerr << #x << " = " << x << endl
using namespace std; typedef long long LL;
const int MAXN = 2E5 + 5; const int MOD = 1E9 + 7; int n, m, T;
#define lid id << 1 #define rid id << 1 | 1
vector<pair<int, int>> p;
struct node { int l, r; int mx, mi; } tr[MAXN << 2];
void update(int id) { tr[id].mx = max(tr[lid].mx, tr[rid].mx); tr[id].mi = min(tr[lid].mi, tr[rid].mi); }
void build(int id, int l, int r) { tr[id].l = l, tr[id].r = r; if (l == r) { tr[id].mx = p[l].second; tr[id].mi = p[l].second; return; } int mid = l + r >> 1; build(lid, l, mid); build(rid, mid + 1, r); update(id); }
int qmin(int id, int l, int r) { if (tr[id].l == l && tr[id].r == r) return tr[id].mi; int mid = tr[id].l + tr[id].r >> 1; if (r <= mid) return qmin(lid, l, r); else if (l > mid) return qmin(rid, l, r); else return min(qmin(lid, l, mid), qmin(rid, mid + 1, r)); }
int qmax(int id, int l, int r) { if (tr[id].l == l && tr[id].r == r) return tr[id].mx; int mid = tr[id].l + tr[id].r >> 1; if (r <= mid) return qmax(lid, l, r); else if (l > mid) return qmax(rid, l, r); else return max(qmax(lid, l, mid), qmax(rid, mid + 1, r)); }
bool check(int mid) { for (int i = 1; i <= n; i++) { int id1 = lower_bound(p.begin() + 1, p.end(), make_pair(p[i].first + mid, 0)) - p.begin(); int id2 = upper_bound(p.begin() + 1, p.end(), make_pair(p[i].first - mid, 0)) - p.begin() - 1; bool tag = 0; if (id1 <= n) { if (qmax(1, id1, n) - p[i].second >= mid || p[i].second - qmin(1, id1, n) >= mid) tag = 1; else tag = 0; } if (id2 >= 1) { if (qmax(1, 1, id2) - p[i].second >= mid || p[i].second - qmin(1, 1, id2) >= mid) tag = 1; else tag = 0; } if (tag) return true; } return false; }
signed main() { ios::sync_with_stdio(false); cin >> n; p.resize(n + 1); for (int i = 1; i <= n; i++) cin >> p[i].first >> p[i].second; sort(p.begin() + 1, p.end()); build(1, 1, n); int l = 0, r = 1e9, ans; while (l <= r) { int mid = l + r >> 1; if (check(mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } cout << ans; return 0; }
|