【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\)是一种可以高效处 ...
随机推荐
- nodejs之日志管理
开发一个项目时,可以通过控制台输出或者debug来获取到项目的运行信息.当项目上线时,我们就需要通过日志来分析.如同Java的log4j,nodejs中也有相关的log4js.使用过log4j的同学应 ...
- -_-#gb2312解码
百度视频采用gb2312编码,点击出来的链接中的中文转成了gb2312,而gb2312无法解码 如果链接中的中文直接utf-8编码,就没问题,但编辑后台有长度限制 关于URL编码 JS(Unicode ...
- 有关DOM的小总结
一直以为DOM(文档对象模型)是JS中最简单的一部分.不可否认,它确实很简单,因为DOM的思维模式有点固定,只需要简单地记住一些固定的方法,所以DOM可以说是所有js(这里指的是客户端的js)入门的起 ...
- ACM1877_又一版A+B
.这道题与2031极为相似. #include<iostream> using namespace std; void fun(int n,int r) { ]="0123456 ...
- nyoj 1022 合纵连横【并查集节点的删除】
合纵连横 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法 ...
- Oracle keep详解
原题目 select * from dept where deptno=(select max(deptno) keep(dense_rank last order by count(1)) fr ...
- Winform 中 DesignMode 返回值不正确的问题。
本文转载:http://blog.csdn.net/sabty/article/details/5325260 以前也曾遇到这样的问题,不过影响不大也没有去详细了解.今天又重新遇到此问题,实在太不便. ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(29)-T4模版
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(29)-T4模版 这讲适合所有的MVC程序 很荣幸,我们的系统有了体验的地址了.演示地址 之前我们发布了一 ...
- Shell脚本编程——了解你的Linux系统必须掌握的20个命令
要想详细了解你的Linux系统,为系统评估和性能调化提供准确的信息,那么,你会经常用到这几组命令. 一. 系统信息 1. 查看内核版本.编译主机.编译器版本和编译时间的信息 cat /p ...
- [Angular 2] 9. Replace ng-modle with #ref & events
Let's say you want to write a simple data bing app. when you type in a text box, somewhere in the ap ...