BZOJ 2648: SJY摆棋子
2648: SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 2968 Solved: 1011
[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
既然题目都这么友好地告诉我们KD-Tree可解了,那就没理由不写KD-Tree了,对吧。( ̄_, ̄ )
对于原本就存在的黑色棋子,那么就先读入,然后用build()建树;对于之后插入的黑色棋子,在insert()中根据KD-Tree的二叉树性质找到合适的叶子结点,插入即可。查询的时候,记得用最优性剪枝,并且合理利用估价函数,以避免TLE。
#include <bits/stdc++.h>
inline int next(void) {
int ret = , neg = , bit = getchar();
while (bit < '') {
if (bit == '-')
neg ^= true;
bit = getchar();
}
while (bit >= '') {
ret = ret* + bit - '';
bit = getchar();
}
return neg ? -ret : ret;
}
const int siz = 2e6 + ;
const int inf = 2e9 + ;
struct node {
int pos[];
int son[];
int min[];
int max[];
}tree[siz];
int root;
int cmp_k;
int qry_x;
int qry_y;
int answer;
inline bool cmp(node a, node b) {
return
(a.pos[cmp_k] ^ b.pos[cmp_k])
? (a.pos[cmp_k] < b.pos[cmp_k])
: (a.pos[!cmp_k] < b.pos[!cmp_k]);
}
inline void update(int t) {
for (int i = ; i < ; ++i)if (tree[t].son[i])
for (int j = ; j < ; ++j) {
if (tree[t].min[j] > tree[tree[t].son[i]].min[j])
tree[t].min[j] = tree[tree[t].son[i]].min[j];
if (tree[t].max[j] < tree[tree[t].son[i]].max[j])
tree[t].max[j] = tree[tree[t].son[i]].max[j];
}
}
int build(int l, int r, int k) {
int d = (l + r) >> ; cmp_k = k;
std::nth_element(
tree + l + ,
tree + d + ,
tree + r + ,
cmp);
if (l != d)tree[d].son[] = build(l, d - , !k);
if (r != d)tree[d].son[] = build(d + , r, !k);
tree[d].min[] = tree[d].max[] = tree[d].pos[];
tree[d].min[] = tree[d].max[] = tree[d].pos[];
return update(d), d;
}
inline void insert(int t) {
for (int p = root, k = ; p != t; k = !k) {
for (int i = ; i < ; ++i) {
if (tree[p].min[i] > tree[t].min[i])
tree[p].min[i] = tree[t].min[i];
if (tree[p].max[i] < tree[t].max[i])
tree[p].max[i] = tree[t].max[i];
}
int &to = tree[p].son[tree[t].pos[k] >= tree[p].pos[k]];
to = to ? to : t; p = to;
}
}
inline int dist(int t) {
if (!t)return inf;
int ret = ;
if (qry_x < tree[t].min[])
ret += tree[t].min[] - qry_x;
if (qry_x > tree[t].max[])
ret += qry_x - tree[t].max[];
if (qry_y < tree[t].min[])
ret += tree[t].min[] - qry_y;
if (qry_y > tree[t].max[])
ret += qry_y - tree[t].max[];
return ret;
}
void query(int t) {
answer = std::min(answer,
std::abs(tree[t].pos[] - qry_x)
+ std::abs(tree[t].pos[] - qry_y));
if (dist(tree[t].son[]) < dist(tree[t].son[])) {
if (dist(tree[t].son[]) < answer)query(tree[t].son[]);
if (dist(tree[t].son[]) < answer)query(tree[t].son[]);
} else {
if (dist(tree[t].son[]) < answer)query(tree[t].son[]);
if (dist(tree[t].son[]) < answer)query(tree[t].son[]);
}
}
signed main(void) {
int n = next();
int m = next();
for (int i = ; i <= n; ++i) {
tree[i].pos[] = next();
tree[i].pos[] = next();
}
root = build(, n, );
for (int i = ; i <= m; ++i) {
int k = next();
int x = next();
int y = next();
if (k == ) {
++n;
tree[n].min[] = tree[n].max[] = tree[n].pos[] = x;
tree[n].min[] = tree[n].max[] = tree[n].pos[] = y;
insert(n);
}
else {
qry_x = x;
qry_y = y;
answer = inf;
query(root);
printf("%d\n", answer);
}
}
}
@Author: YouSiki
BZOJ 2648: SJY摆棋子的更多相关文章
- 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摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 6051 Solved: 2113[Submit][Status][Discuss] Descript ...
- bzoj 2648 SJY摆棋子 kd树
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...
- BZOJ 2648 SJY摆棋子(KD Tree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...
- bzoj 2648 SJY摆棋子——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...
- 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
[题目分析] KD-Tree第一题,其实大概就是搜索剪枝的思想,在随机数据下可以表现的非常好NlogN,但是特殊数据下会达到N^2. 精髓就在于估价函数get以及按照不同维度顺序划分的思想. [代码] ...
- BZOJ 2648 SJY摆棋子(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2716 [题目大意] 给出一些点,同时不断插入点和询问某点离插入点最近距离 [题解] 我 ...
随机推荐
- BZOJ 2005: [Noi2010]能量采集
2005: [Noi2010]能量采集 Time Limit: 10 Sec Memory Limit: 552 MBSubmit: 3312 Solved: 1971[Submit][Statu ...
- Windows系统服务器IIS7.5 Asp.net支持10万请求的设置方法
问题现象 ECS Windows系统服务器基于IIS搭建的网站由于IIS默认的配置,服务器最多只能处理5000个同时请求,访问量大时很容易导致报错: Error Summary: HTTP Erro ...
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(6)--在线调整虚拟机的大小
前面提到过openstack环境部署及创建虚拟机的完整过程,然后有时候会发现创建的虚拟机规格太小,满足不了业务需求:亦或是虚拟机规格太大,容易造成资源浪费.于是就有了在线拉伸虚拟机规格的需求.所以,今 ...
- linux运维中的命令梳理(三)
----------文本操作命令---------- sed命令:文本编辑工具 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特 ...
- django复习笔记3:实战
1.初始化 2.配置后台,增加测试数据 3.测试urls/views/templates 4.增加静态资源 5.修改样式 6.模版继承 7.增加博文主页 8.增加表单 9.完善新增页面和编辑页面的表单 ...
- uwp项目总结
- js Dialog 去掉右上角的X关闭功能
用到 dialog弹出框时,不想要右上角的X 关闭功能,只是做个提示信息显示,下面是具体的去掉方法,大家可以参考下 再用到 dialog弹出框时,不想要右上角的X 关闭功能,只是做个提示信息显示. 在 ...
- DEDECMS之九 文章采集
到很多网友都为织梦(DEDECMS)的采集教程头疼,的确,官方出的教程太笼统了,什么都没说,换个网站你什么都做不了,这个教程是最详尽的教程,让你一看即会! 一.列表采集 第一步.我们打开织梦后台点击采 ...
- springmvc请求参数异常处理
接着上一篇<springmvc 通过异常增强返回给客户端统一格式>讲通过spring ControllerAdvice对各种异常进行拦截处理,统一格式返回给客户端. 接下来我们更精细的讲, ...
- 用Map-Reduce的思维处理数据
在很多人的眼里,Map-Reduce等于Hadoop,没有Hadoop谈Map-Reduce犹如自上谈兵,实则不然,Map-Reduce是一种计算模型,只是非常适合在并行的环境下运行,Hadoop是M ...