BZOJ 2648: SJY摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 6051 Solved: 2113
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1
2 3
2 1 2
1 3 3
2 4 2
Sample Output
2
HINT
kdtree可以过
Source
K-D Tree裸题
洛谷上需要拍扁重构才能过
丧心病狂
#include<cstdio>
#include<algorithm>
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 17, stdin), p1 == p2) ? EOF : *p1++)
using namespace std;
const int MAXN = * 1e5 + , INF = 1e9 + ;
const double delat = 0.60;
char buf[ << ], *p1 = buf, *p2 = buf;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M, WD, root, Ans;
inline int abs(int x) {
return x < ? -x : x;
}
#define ls(x) T[x].ls
#define rs(x) T[x].rs
struct Point {
int x[];
bool operator < (const Point rhs) const {
return x[WD] < rhs.x[WD];
}
}p[MAXN];
struct Node {
int ls, rs, siz, mi[], mx[];
Point tp;
}T[MAXN];
int rub[MAXN], top, cur;
int NewNode() {
return top ? rub[top--] : ++cur;//tag
}
void update(int k) {
T[k].siz = T[ls(k)].siz + T[rs(k)].siz + ;
for(int i = ; i <= ; i++) {
T[k].mi[i] = T[k].mx[i] = T[k].tp.x[i];
if(ls(k)) T[k].mi[i] = min(T[k].mi[i], T[ls(k)].mi[i]), T[k].mx[i] = max(T[k].mx[i], T[ls(k)].mx[i]);
if(rs(k)) T[k].mi[i] = min(T[k].mi[i], T[rs(k)].mi[i]), T[k].mx[i] = max(T[k].mx[i], T[rs(k)].mx[i]);
}
}
int Build(int l, int r, int wd) {
if(l > r) return ;
int k = NewNode(), mid = l + r >> ;
WD = wd, nth_element(p + l, p + mid, p + r + );
T[k].tp = p[mid];
T[k].ls = Build(l, mid - , wd ^ );
T[k].rs = Build(mid + , r, wd ^ );
update(k);
return k;
}
inline void Apart(int k, int num) {
if(T[k].ls) Apart(ls(k), num);
p[num + T[ls(k)].siz + ] = T[k].tp, rub[++top] = k;
if(T[k].rs) Apart(rs(k), num + T[ls(k)].siz + );
}
inline int check(int &k, int wd) {
if(T[k].siz * delat < T[ls(k)].siz || T[k].siz * delat < T[rs(k)].siz)
Apart(k, ), k = Build(, T[k].siz, wd);
}
void Insert(Point a, int &k, int wd) {
if(k == ) {
k = NewNode(); T[k].tp = a; update(k); return ;
}
if(a.x[wd] < T[k].tp.x[wd]) Insert(a, ls(k), wd ^ );
else Insert(a, rs(k), wd ^ );
update(k); check(k, wd);
}
inline int dis(Point a, Point b) {
return abs(a.x[] - b.x[]) + abs(a.x[] - b.x[]);
}
inline int Manha(Point a, int b) {
int rt = ;
for(int i = ; i <= ; i++)
rt += max(, a.x[i] - T[b].mx[i]) + max(, T[b].mi[i] - a.x[i]);
return rt;
}
int Query(Point a, int k) {
Ans = min(Ans, dis(T[k].tp, a));
int disl = INF, disr = INF;
if(ls(k)) disl = Manha(a, T[k].ls);
if(rs(k)) disr = Manha(a, T[k].rs);
if(disl < disr) {
if(disl < Ans) Query(a, ls(k));
if(disr < Ans) Query(a, rs(k));
}
else {
if(disr < Ans) Query(a, rs(k));
if(disl < Ans) Query(a, ls(k));
}
}
int main() {
#ifdef WIN32
freopen("a.in", "r", stdin);
#endif
N = read(); M = read();
for(int i = ; i <= N; i++)
p[i].x[] = read(), p[i].x[] = read();
root = Build(, N, );
while(M--) {
int opt = read(), x = read(), y = read();
if(opt == )
Insert((Point){x, y}, root, );
else
Ans = INF + , Query((Point){x, y}, root), printf("%d\n", Ans);
}
return ;
}
BZOJ 2648: SJY摆棋子(K-D Tree)的更多相关文章
- BZOJ 2648 SJY摆棋子(KD Tree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...
- BZOJ 2648: SJY摆棋子
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2968 Solved: 1011[Submit][Status][Disc ...
- BZOJ 2648: SJY摆棋子 kdtree
2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- bzoj 2648 SJY摆棋子——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...
- BZOJ 2648 SJY摆棋子 ——KD-Tree
[题目分析] KD-Tree第一题,其实大概就是搜索剪枝的思想,在随机数据下可以表现的非常好NlogN,但是特殊数据下会达到N^2. 精髓就在于估价函数get以及按照不同维度顺序划分的思想. [代码] ...
- bzoj 2648 SJY摆棋子 kd树
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...
- bzoj 2648 SJY摆棋子 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 学习资料:https://blog.csdn.net/zhl30041839/arti ...
- bzoj 2648: SJY摆棋子【KD-tree】
其实理论上cdq更优 核心是依次取x值.y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小:mx[0/1]:子树内最大x/y:mn[0/1]:子树内最小x/y:d[0/1]:这 ...
随机推荐
- 验证两台机器已经建立的ssh互信
1.expect方法 #!/bin/bash checkTrust() { expect -c ' set timeout 2; spawn ssh $1 "expr 12345678 + ...
- JS 日期与时间戳相互转化
1.日期格式转时间戳 function getTimestamp(time) { return Date.parse(new Date(time)); } 2.时间戳转日期格式 function tr ...
- 新建虚拟机,每次都提示无法连接虚拟设备 ide1:0
处理方式:看到了这个老哥http://www.cnblogs.com/dean-du/p/6888513.html的博客,发现问题是一样的,所以记录一下. 将虚拟机设置中的CD/DVD选项中的连接更改 ...
- javascript requestAnimationFrame vs. setTimeout
在做javascript动画时,我们常常使用的方法就是通过setTimeout调用告诉浏览器每隔20ms执行一段js代码来对dom对象执行操作,这个貌似没有什么问题,但是当深入理解计算机的fps以及浏 ...
- 新特性之MAPI over HTTP \ 配置 MAPI over HTTP
Exchange 2016 中的 MAPI over HTTP https://docs.microsoft.com/zh-cn/Exchange/clients/mapi-over-http/map ...
- [BZOJ 4573][ZJOI 2016]大森林
[LOJ 2092][BZOJ 4573][UOJ 195][ZJOI 2016]大森林 题意 给定一个树序列, 初始时所有树都只有一个点, 要求支持三种操作: 区间种树(在某个特定点上长出一个子结点 ...
- iOS自动化-iOS录屏xrecord及解决iPhone设备不显示的问题
github地址:https://github.com/WPO-Foundation/xrecord 安装方法: git clone https://github.com/WPO-Foundation ...
- 当有多个相同的DIV时,我怎么判断我点击的是哪个嘞
链接:https://segmentfault.com/a/1190000003480973?utm_source=tuicool&utm_medium=referral 序言 这是我曾经面试 ...
- 前端——实用UI组件库
Angular UI 组件 ngx-bootstrap 是一套Bootstrap 组件 官网:https://valor-software.com/ngx-bootstrap/#/ github: h ...
- js 调用 oc 的解释
JavaScriptCore NSInvocation js解释器在解释函数调用时,会在执行环境进行函数搜索,主调者类型判定: 如果是js调用,直接解释执行: 如果是oc调用,则将调用打包成NSInv ...