【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 2459 Solved: 834
[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
2716: [Violet 3]天使玩偶
Time Limit: 80 Sec Memory Limit: 128 MB
Submit: 1098 Solved: 485
[Submit][Status][Discuss]
Description
.gif)
Input
.gif)
Output
.gif)
Sample Input
Sample Input
Sample Output
Sample Output
HINT
.gif)
Source
Solution
双倍经验题,KD Tree模板题
KD Tree是一种切割多维空间的数据结构,主要用于多维空间信息的搜索(范围搜索和最近邻搜索)
大体上每层按照不同的维度进行左右建树,分开平面上的点,本质还是一颗平衡二叉树
效率大概是$O(log^{2}N)$的,比较暴力的做法

Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 500010
int n,m,D;
struct PointNode
{
int d[],mn[],mx[],l,r;
PointNode(int x=,int y=) {l=r=;d[]=x;d[]=y;}
bool operator < (const PointNode & A) const {return d[D]<A.d[D];}
}p[maxn];
int dis(PointNode a,PointNode b) {return abs(a.d[]-b.d[])+abs(a.d[]-b.d[]);}
struct K_DTreeNode
{
int rt,ans;
PointNode Point,tree[maxn<<];
void Update(int now)
{
for (int i=; i<=; i++)
{
if (tree[now].l)
tree[now].mn[i]=min(tree[now].mn[i],tree[tree[now].l].mn[i]),tree[now].mx[i]=max(tree[now].mx[i],tree[tree[now].l].mx[i]);
if (tree[now].r)
tree[now].mn[i]=min(tree[now].mn[i],tree[tree[now].r].mn[i]),tree[now].mx[i]=max(tree[now].mx[i],tree[tree[now].r].mx[i]);
}
}
int BuildTree(int l,int r,int dd)
{
D=dd; int mid=(l+r)>>;
nth_element(p+l,p+mid,p+r+);
tree[mid]=p[mid];
for (int i=; i<=; i++) tree[mid].mn[i]=tree[mid].mx[i]=tree[mid].d[i];
if (l<mid) tree[mid].l=BuildTree(l,mid-,dd^);
if (r>mid) tree[mid].r=BuildTree(mid+,r,dd^);
Update(mid);
return mid;
}
void Insert(int now,int dd)
{
if (Point.d[dd]>=tree[now].d[dd])
if (tree[now].r) Insert(tree[now].r,dd^);
else
{
tree[now].r=++n; tree[n]=Point;
for (int i=; i<=; i++) tree[n].mn[i]=tree[n].mx[i]=tree[n].d[i];
}
else
if (tree[now].l) Insert(tree[now].l,dd^);
else
{
tree[now].l=++n; tree[n]=Point;
for (int i=; i<=; i++) tree[n].mn[i]=tree[n].mx[i]=tree[n].d[i];
}
Update(now);
}
int dist(int p1,PointNode p)
{
int re=;
for (int i=; i<=; i++) re+=max(,tree[p1].mn[i]-p.d[i]);
for (int i=; i<=; i++) re+=max(,p.d[i]-tree[p1].mx[i]);
return re;
}
void Query(int now,int dd)
{
int dl,dr,d0;
d0=dis(tree[now],Point);
if (d0<ans) ans=d0;
if (tree[now].l) dl=dist(tree[now].l,Point); else dl=0x7f7f7f7f;
if (tree[now].r) dr=dist(tree[now].r,Point); else dr=0x7f7f7f7f;
if (dl<dr)
{
if (dl<ans) Query(tree[now].l,dd^);
if (dr<ans) Query(tree[now].r,dd^);
}
else
{
if (dr<ans) Query(tree[now].r,dd^);
if (dl<ans) Query(tree[now].l,dd^);
}
}
void insert(PointNode _p){Point=_p; Insert(rt,);}
void init(){rt=BuildTree(,n,);}
int query(PointNode _p){Point=_p;ans=0x7fffffff; Query(rt,); return ans;}
}KDT;
int main()
{
// freopen("angel.in","r",stdin); freopen("angel.out","w",stdout);
n=read(),m=read();
for (int i=; i<=n; i++) p[i].d[]=read(),p[i].d[]=read();
KDT.init();
for (int i=; i<=m; i++)
{
int opt=read(),x=read(),y=read();
if (opt==) KDT.insert(PointNode(x,y));
if (opt==) printf("%d\n",KDT.query(PointNode(x,y)));
}
return ;
}
模板是参考的zky学长的,zky学长好神%%%
【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree的更多相关文章
- 【BZOJ 2648】SJY摆棋子 & 【BZOJ 2716】【Violet 3】天使玩偶
KDTree模板,双倍经验啦啦啦- #include<cstdio> #include<cstring> #include<algorithm> #define r ...
- 【34.25%】【BZOJ 2648】SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB Submit: 2718 Solved: 931 [Submit][Status][Discuss] Descrip ...
- 【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶
KD-Tree 传说中的kd树...前去膜拜了一下……写道模板题>_< 写kdtree的一些感想: 插入的时候是像可持久化线段树一样直接在最后开新节点,然后更新它所在的块.. 然而其实也是 ...
- BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)
Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...
- BZOJ.2716.[Violet3]天使玩偶(K-D Tree)
题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 ...
- [bzoj2648/2716]SJY摆棋子_KD-Tree
SJY摆旗子 bzoj-2648 题目大意:平面上有n个黑子.有m个操作,可以下一颗白子,查询与曼哈顿距离下最近黑子之间的曼哈顿距离,或者下一颗黑子. 注释:$1\le n,m\le 5\cdot 1 ...
- BZOJ 2648/2716(SJY把件-KD_Tree)[Template:KD_Tree]
2648: SJY把件 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1180 Solved: 391 [id=2648" style= ...
- [bzoj2648/2716]SJY摆棋子
平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000 用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...) #include< ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
随机推荐
- 迭代器和for-of循环 顺便带一下Es5中的.map遍历
let set = new Set(); //set方法去除重复的数据 [1, 2, 3, 4, 2, 8, 4].map(function (elem) { set.add(elem); //遍历完 ...
- SQL server 专业词汇
sql组成:DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.updateDCL:数据库控制语言 ,关键字:grant.removeDQL:数据 ...
- Apache Rewrite 拟静态配置
1.mod_rewrite 简介和配置 Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 2.mod_ ...
- 【转】Sql Server参数化查询之where in和like实现之xml和DataTable传参
转载至: http://www.cnblogs.com/lzrabbit/archive/2012/04/29/2475427.html 在上一篇Sql Server参数化查询之where in和li ...
- IE8中给HTML标签负值报错问题
当通过JS给一个HTML标签设置高宽为负值的时候,会爆出一个“参数无效”的错误 chrome下不会报错,但是元素不会做任何关于负值的改变
- python 播放 wav 文件
未使用其他库, 只是使用 pywin32 调用系统底层 API 播放 wav 文件. # Our raison d'etre - playing sounds import pywintypes im ...
- Java中primitive type的线程安全性
Java中primite type,如char,integer,bool之类的,它们的读写操作都是atomic的,但是有几个例外: long和double类型不是atomic的,因为long和doub ...
- Scala函数式编程进阶
package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...
- md5加密篇(一)
/// <summary> /// 获取文件的md5摘要 /// </summary> /// <param name="sFile">文件流& ...