bzoj

题意:

给出\(n\)个点,对于每个点,\(d_i\)等于距离其最远的点的距离减去距离最近的点的距离。这里的距离为曼哈顿距离。

求\(min\{d_i\}\)。

思路:

考虑直接对每个点暴力枚举,然后在\(kd-tree\)上找最远点和最近点。

最好复杂度\(O(nlogn)\),但最差复杂度为\(O(n^2)\),一般复杂度当作\(O(n\sqrt{n})\)就行。

找最远点跟找最近点类似,也要写个估价函数。

细节见代码:(细节写错了改了好久qaq)

/*
* Author: heyuhhh
* Created Time: 2019/11/25 19:33:50
*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <iomanip>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
//#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 5e5 + 5; int n;
int x[N], y[N]; int D;
struct Point {
int mn[2], mx[2];
int d[2], l, r;
int& operator [] (int x) {return d[x];}
bool operator < (const Point &A) const {
return d[D] < A.d[D];
}
Point(int x = 0, int y = 0) {
d[0] = x, d[1] = y;
l = r = 0;
mn[0] = mx[0] = x;
mn[1] = mx[1] = y;
}
}p[N];
int rt;
struct kdtree {
Point tr[N];
int ans, tot;
void push_up(int o) {
Point f = tr[o];
Point ls = tr[f.l], rs = tr[f.r];
for(int i = 0; i < 2; i++) {
if(f.l) tr[o].mn[i] = min(tr[o].mn[i], ls.mn[i]), tr[o].mx[i] = max(tr[o].mx[i], ls.mx[i]);
if(f.r) tr[o].mn[i] = min(tr[o].mn[i], rs.mn[i]), tr[o].mx[i] = max(tr[o].mx[i], rs.mx[i]);
}
}
int build(int l, int r, int now) {
int mid = (l + r) >> 1;
D = now;
nth_element(p + l, p + mid, p + r + 1);
tr[mid] = p[mid];
if(l < mid) tr[mid].l = build(l, mid - 1, now ^ 1);
if(r > mid) tr[mid].r = build(mid + 1, r, now ^ 1);
push_up(mid);
return mid;
}
int get(Point t1, Point t2) {
int res = 0;
for(int i = 0; i < 2; i++) {
res += max(0, t1[i] - t2.mx[i]) + max(0, t2.mn[i] - t1[i]);
}
return res;
}
int dis(Point t1, Point t2) {
int res = 0;
for(int i = 0; i < 2; i++) {
res += abs(t1[i] - t2[i]);
}
return res;
}
int get2(Point t1, Point t2) {
int res = 0;
for(int i = 0; i < 2; i++) {
res += max(abs(t1[i] - t2.mx[i]), abs(t1[i] - t2.mn[i]));
}
return res;
}
void query_min(int o, int now, Point T) {
int lv = INF, rv = INF;
int ok = 0;
for(int i = 0; i < 2; i++) {
if(T[i] != tr[o][i]) ok = 1;
}
if(ok) ans = min(ans, dis(T, tr[o]));
if(tr[o].l) lv = get(T, tr[tr[o].l]);
if(tr[o].r) rv = get(T, tr[tr[o].r]);
if(lv < rv) {
if(lv < ans) query_min(tr[o].l, now ^ 1, T);
if(rv < ans) query_min(tr[o].r, now ^ 1, T);
} else {
if(rv < ans) query_min(tr[o].r, now ^ 1, T);
if(lv < ans) query_min(tr[o].l, now ^ 1, T);
}
}
void query_max(int o, int now, Point T) {
int lv = 0, rv = 0;
int ok = 0;
for(int i = 0; i < 2; i++) {
if(T[i] != tr[o][i]) ok = 1;
}
if(ok) ans = max(ans, dis(T, tr[o]));
if(tr[o].l) lv = get2(T, tr[tr[o].l]);
if(tr[o].r) rv = get2(T, tr[tr[o].r]);
if(lv > rv) {
if(lv > ans) query_max(tr[o].l, now ^ 1, T);
if(rv > ans) query_max(tr[o].r, now ^ 1, T);
} else {
if(rv > ans) query_max(tr[o].r, now ^ 1, T);
if(lv > ans) query_max(tr[o].l, now ^ 1, T);
}
}
int query_min(int x, int y) {
ans = INF;
query_min(rt, 0, Point(x, y));
return ans;
}
int query_max(int x, int y) {
ans = 0;
query_max(rt, 0, Point(x, y));
return ans;
}
}kd; void run(){
for (int i = 1; i <= n; i++) {
cin >> x[i] >> y[i];
p[i] = Point(x[i], y[i]);
}
rt = kd.build(1, n, 0);
int ans = INF;
for(int i = 1; i <= n; i++) {
int Min = kd.query_min(x[i], y[i]);
int Max = kd.query_max(x[i], y[i]);
ans = min(ans, Max - Min);
}
cout << ans << '\n';
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
while(cin >> n) run();
return 0;
}

【bzoj1941】[Sdoi2010]Hide and Seek(kd-tree)的更多相关文章

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

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

  2. 【bzoj1941】 Sdoi2010—Hide and Seek

    http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接) 题意 给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小. Sol ...

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

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

  4. 【SPOJ】Longest Common Substring II (后缀自动机)

    [SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...

  5. 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)

    [UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...

  6. 【BZOJ1717】产奶的模式(后缀数组)

    [BZOJ1717]产奶的模式(后缀数组) 题面 权限题 hihocoder 洛谷 题解 \(hihocoder\)里面讲的非常好了 这题要求的就是最长可重叠重复K次子串 所谓相同的子串 我们可以理解 ...

  7. 【BZOJ2154】Crash的数字表格(莫比乌斯反演)

    [BZOJ2154]Crash的数字表格(莫比乌斯反演) 题面 BZOJ 简化题意: 给定\(n,m\) 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 以下的一切都 ...

  8. 【BZOJ3436】小K的农场(差分约束)

    [BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...

  9. 【Luogu3732】[HAOI2017]供给侧改革(Trie树)

    [Luogu3732][HAOI2017]供给侧改革(Trie树) 题面 洛谷 给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值. 题解 一个暴力 ...

随机推荐

  1. Centos7 下安装python3及卸载

    一.安装python3 1.安装依赖包 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...

  2. GO 使用静态链接库编译 生成可执行文件 使用第三方 .a 文件,无源码构造

    go build 和 go install 都需要使用源码来进行编译.但是有时候我们只有.a或者.so文件.并不能获取到第三方库的源码,这时我们需要静态链接库编译的技巧: 上图是实验前的文件分布. 使 ...

  3. Linux部署NFS服务共享文件

    NFS(网络文件系统)用于linux共享文件 第1步:配置所需要的环境 使用两台Linux主机 主机名称 操作系统 IP地址 NFS Centos7 192.168.218.139 NFSa Cent ...

  4. 删除Word中出现的空白页

    删除Word中出现的空白页 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ Word中出现空白页,怎么删都删不掉,Backspace与Delete键不管 ...

  5. Codeforces Round #603 (Div. 2) F. Economic Difficulties dp

    F. Economic Difficulties An electrical grid in Berland palaces consists of 2 grids: main and reserve ...

  6. php使用inotify扩展监控文件或目录的变化

    一.安装inotify扩展 1.下载inotify扩展源码 https://pecl.php.net/package/inotify 对于php7以上版本,请下载 inotify-2.0.0.tgz. ...

  7. C++ delete 和 delete []的区别

    转载自https://blog.csdn.net/cbNotes/article/details/38900799 1.我们通常从教科书上看到这样的说明:delete 释放new分配的单个对象指针指向 ...

  8. java Integer中隐藏的细节魔鬼!来自面试官的三轮暴击!

    1 第一波暴击!!! 程序员比较实在,一般会说: 那就先上代码 package com.example.demo; public class TestInteger { public static v ...

  9. CNN反向传播更新权值

    背景 反向传播(Backpropagation)是训练神经网络最通用的方法之一,网上有许多文章尝试解释反向传播是如何工作的,但是很少有包括真实数字的例子,这篇博文尝试通过离散的数据解释它是怎样工作的. ...

  10. SpringBoot 2.X从0到1实现邮件发送功能

    Spring中提供了JavaMailSender接口实现邮件发送功能,在SpringBoot2.X中也封装了发送邮件相关的Starter并且提供了自动化配置. 本文目录 一.添加对应的Starter二 ...