【bzoj1941】[Sdoi2010]Hide and Seek(kd-tree)
题意:
给出\(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)的更多相关文章
- 【BZOJ1941】[Sdoi2010]Hide and Seek KDtree
[BZOJ1941][Sdoi2010]Hide and Seek Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了 ...
- 【bzoj1941】 Sdoi2010—Hide and Seek
http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接) 题意 给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小. Sol ...
- 【bzoj1941】[Sdoi2010]Hide and Seek KD-tree
题目描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. ...
- 【SPOJ】Longest Common Substring II (后缀自动机)
[SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...
- 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)
[UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...
- 【BZOJ1717】产奶的模式(后缀数组)
[BZOJ1717]产奶的模式(后缀数组) 题面 权限题 hihocoder 洛谷 题解 \(hihocoder\)里面讲的非常好了 这题要求的就是最长可重叠重复K次子串 所谓相同的子串 我们可以理解 ...
- 【BZOJ2154】Crash的数字表格(莫比乌斯反演)
[BZOJ2154]Crash的数字表格(莫比乌斯反演) 题面 BZOJ 简化题意: 给定\(n,m\) 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 以下的一切都 ...
- 【BZOJ3436】小K的农场(差分约束)
[BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...
- 【Luogu3732】[HAOI2017]供给侧改革(Trie树)
[Luogu3732][HAOI2017]供给侧改革(Trie树) 题面 洛谷 给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值. 题解 一个暴力 ...
随机推荐
- bay——巡检RAC操作.txt
Oracle Cluster Software 包括下列组件:Event Management (EVM)Cluster Synchronization Services (CSS)Cluster R ...
- A Neural Influence Diffusion Model for Social Recommendation 笔记
目录 一.摘言 二.杂记 三.问题定义和一些准备工作 四.模型真思想 五.实验部分 六.参考文献 一.摘言 之前协同过滤利用user-item交互历史很好的表示了user和item.但是由于用户行为的 ...
- R-长尾词练习
一. 长尾关键词的特征 长尾关键词通常比较长,往往是2-3个词组成,甚至是短语,存在于内容页面,除了内容页的标题,还存在于内容中. 长尾关键词搜索量虽然非常少,而且不稳定.但是搜索量甚至超越热门目标关 ...
- 转载-ThreadPoolExecutor里面4种拒绝策略(详细)
原文链接:https://blog.csdn.net/wjs19930820/article/details/79849050 1 /** * 定义异步任务执行线程池 */ @Configuratio ...
- Flink on YARN时,如何确定TaskManager数
转自: https://www.jianshu.com/p/5b670d524fa5 答案写在最前面:Job的最大并行度除以每个TaskManager分配的任务槽数. 问题 在Flink 1.5 Re ...
- D - Ugly Problem HDU - 5920
D - Ugly Problem HDU - 5920 Everyone hates ugly problems. You are given a positive integer. You must ...
- 实例演示 C# 中 Dictionary<Key, Value> 的检索速度远远大于 hobbyList.Where(c => c.UserId == user.Id)
前言 我们知道,有时候在一些项目中,为了性能,往往会一次性加载很多条记录来进行循环处理(备注:而非列表呈现).比如:从数据库中加载 10000 个用户,并且每个用户包含了 20 个“爱好”,在 Wi ...
- netty ByteBuf与String相互转换
String转为ByteBuf 1)使用String.getBytes(Charset),将String转为byte[]类型 2)使用Unpooled.wrappedBuffer(byte[]),将b ...
- 百度ai语音识别
//语音识别功能 var APP_ID = "149**323"; var API_KEY = "N1Po****o6WPUeU8er"; var SECRET ...
- 02Javascript变量和数据类型
1. 变量概述 1.1 什么是变量 通俗:变量是用于存放数据的容器. 我们通过 变量名 获取数据,甚至数据可以修改. 1.2 变量在内存中的存储 本质:变量是程序在内存中申请的一块用来存放数据的空间. ...