【BZOJ2648】【kd_tree】SJY摆棋子
/*
唐代李白
《江夏别宋之悌》
楚水清若空,遥将碧海通。人分千里外,兴在一杯中。
谷鸟吟晴日,江猿啸晚风。平生不下泪,于此泣无穷.
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <utility>
#include <iomanip>
#include <string>
#include <cmath>
#include <queue>
#include <assert.h>
#include <map>
#include <ctime>
#include <cstdlib>
#include <stack>
#include <set>
#define LOCAL
const int INF = 0x7fffffff;
const int MAXN = + ;
const int maxnode = * + * ;
const int MAXM = + ;
const int MAX = ;
using namespace std;
struct Node{//kd_tree
int d[], l, r;
int Max[], Min[];
}t[ + ],tmp; int n,m,root,cmp_d;
int k1, k2, k3, Ans; bool cmp(Node a, Node b){return (a.d[cmp_d]<b.d[cmp_d]) || ((a.d[cmp_d] == b.d[cmp_d]) && (a.d[!cmp_d] < b.d[!cmp_d]));}
void update(int p){
if (t[p].l){
//左边最大的横坐标值
t[p].Max[] = max(t[p].Max[], t[t[p].l].Max[]);
t[p].Min[] = min(t[p].Min[], t[t[p].l].Min[]);
t[p].Max[] = max(t[p].Max[], t[t[p].l].Max[]);
t[p].Min[] = min(t[p].Min[], t[t[p].l].Min[]);
}
if (t[p].r){
t[p].Max[] = max(t[p].Max[], t[t[p].r].Max[]);
t[p].Min[] = min(t[p].Min[], t[t[p].r].Min[]);
t[p].Max[] = max(t[p].Max[], t[t[p].r].Max[]);
t[p].Min[] = min(t[p].Min[], t[t[p].r].Min[]);
}
return;
}
//d是横竖切..
int build(int l, int r, int D){
int mid = (l + r) / ;
cmp_d = D;
//按照cmp的比较顺序在l到r中找到第mid大的元素
nth_element(t + l + , t + mid + , t + r + , cmp);
t[mid].Max[] = t[mid].Min[] = t[mid].d[];
t[mid].Max[] = t[mid].Min[] = t[mid].d[];
//递归建树
if (l != mid) t[mid].l = build(l, mid - , D ^ );
if (r != mid) t[mid].r = build(mid + , r, D ^ );
update(mid);
return mid;
}
void insert(int now){
int D = , p = root;//D还是表示方向
while (){
//边下传边更新
t[p].Max[] = max(t[p].Max[], t[now].Max[]);
t[p].Min[] = min(t[p].Min[], t[now].Min[]);
t[p].Max[] = max(t[p].Max[], t[now].Max[]);
t[p].Min[] = min(t[p].Min[], t[now].Min[]);
//有没有点线段树的感觉..
if (t[now].d[D] >= t[p].d[D]){
if (t[p].r == ){
t[p].r = now;
return;
}else p = t[p].r;
}else{
if (t[p].l == ){
t[p].l = now;
return;
}else p = t[p].l;
}
D = D ^ ;
}
return;
}
int ABS(int x) {return x < ? -x : x;}
//dist越小代表越趋近?
int dist(int p1, int px, int py){
int dist = ;
if (px < t[p1].Min[]) dist += t[p1].Min[] - px;
if (px > t[p1].Max[]) dist += px - t[p1].Max[];
if (py < t[p1].Min[]) dist += t[p1].Min[] - py;
if (py > t[p1].Max[]) dist += py - t[p1].Max[];
return dist;
}
void ask(int p){
int dl, dr, d0;
//哈密顿距离
d0=ABS(t[p].d[] - k2) + ABS(t[p].d[] - k3);
if(d0 < Ans) Ans = d0;
if(t[p].l) dl = dist(t[p].l, k2, k3); else dl = 0x7f7f7f7f;
if(t[p].r) dr = dist(t[p].r, k2, k3); else dr = 0x7f7f7f7f;
//应该是一个启发式的过程。
if(dl < dr){
if(dl < Ans) ask(t[p].l);
if(dr < Ans) ask(t[p].r);
}else{
if(dr < Ans) ask(t[p].r);
if(dl < Ans) ask(t[p].l);
}
} void init(){
//假设0为横坐标
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%d%d", &t[i].d[], &t[i].d[]);
root = build(, n, );
}
void work(){
for (int i = ; i <= m ;i++){
scanf("%d%d%d", &k1, &k2, &k3);
if (k1 == ){//黑棋
++n;
t[n].Max[] = t[n].Min[] = t[n].d[] = k2;
t[n].Max[] = t[n].Min[] = t[n].d[] = k3;
insert(n);
}else{
Ans = 0x7f7f7f7f;
ask(root);
printf("%d\n", Ans);
}
}
} int main(){ init();
work();
return ;
}
【BZOJ2648】【kd_tree】SJY摆棋子的更多相关文章
- 【BZOJ2648】SJY摆棋子(KD-Tree)
[BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...
- 【BZOJ2648】SJY摆棋子 KDtree
[BZOJ2648]SJY摆棋子 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找 ...
- 【BZOJ2648】SJY摆棋子 [KD-tree]
SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己 ...
- [bzoj2648/2716]SJY摆棋子_KD-Tree
SJY摆旗子 bzoj-2648 题目大意:平面上有n个黑子.有m个操作,可以下一颗白子,查询与曼哈顿距离下最近黑子之间的曼哈顿距离,或者下一颗黑子. 注释:$1\le n,m\le 5\cdot 1 ...
- BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)
Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...
- 【bzoj2648】 SJY摆棋子
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 (题目链接) 题意 动态维护二维平面上的点的插入以及最邻近域搜索. Solution KDtr ...
- [bzoj2648/2716]SJY摆棋子
平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000 用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...) #include< ...
- BZOJ2648:SJY摆棋子
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- 【BZOJ2648】SJY摆棋子
题目大意:维护一个二维平面,平面上初始有 N 个点,支持两种操作:平面加点.查询距离某个指定点的最小哈密顿距离. 题解:学习到了 kd-tree 数据结构. kd-tree 类似于平衡树,即:每个节点 ...
- 【bzoj2648】SJY摆棋子(kdtree)
传送门 题意: 二维平面上有若干个点. 现在要维护一种数据结构,支持插入一个点以及询问其余点到某个点的最小曼哈顿距离. 思路: 这是个\(kdtree\)模板题. \(kdtree\)是一种可以高效处 ...
随机推荐
- U盘安装 OSX
首先,刚从app store下载完的OS X Lion会放在屏幕下方的Dock中. 用鼠标将Mac OS X Lion 10.7文件从Dock中拖放到桌面. 右键单击Mac OS X Lion 10. ...
- XML文档部署到Tomcat服务器上总是加载出错
config.xnl 起初文档路径是在src/Dao/config.xml 在Dao目录下BaseDao类中,解析config.xml文件路径 path="/Dao/config.xml&q ...
- HashMap和Hashtable
HashTable 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的 速 ...
- Codevs 3304 水果姐逛水果街Ⅰ 线段树
题目: http://codevs.cn/problem/3304/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 D ...
- 深入hibernate的三种状态【转载】
这篇文章写得很好,举了很多例子. http://www.cnblogs.com/xiaoluo501395377/p/3380270.html
- hdoj 2647 Reward【反向拓扑排序】
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- runtime/KVO等面试题
整理中... 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中 ...
- valuestack(值栈) 和 actioncontext(上下文)
Strut2的Action类通过属性可以获得所有相关的值,如请求参数属性值等.要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性.在Struts2调用Action类的Ac ...
- 【转】服务器证书安装配置指南(Weblogic)
服务器证书安装配置指南(Weblogic) 详情请点击: http://verisign.itrus.com.cn/html/fuwuyuzhichi/fuwuqizhengshuanzhuangpe ...
- [置顶] UITableViewCell
UITableViewCellStyle: 四种Cell类型. UITableViewCellSeparatorStyle 分割线类型.(group三种,plain两种) UITableViewCel ...