【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
Input
Output
Sample Input
Sample Input
Sample Output
Sample Output
HINT
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 ...
随机推荐
- vim一些常用的快捷键
快速注释: Ctrl+v I // esc 打开文件 gf ctrl+o
- Html5的一些引擎使用感触
记得在2011年的时候,51CTO曾经采访我对H5的看法,因为当时Html5小组和雷友的关系,感觉是一片大火的形式,当时我的看法是:第一盈利模式不清晰,第二硬件跟不上,第三技术不成熟. 第一和第二点很 ...
- 异常检测算法--Isolation Forest
南大周志华老师在2010年提出一个异常检测算法Isolation Forest,在工业界很实用,算法效果好,时间效率高,能有效处理高维数据和海量数据,这里对这个算法进行简要总结. iTree 提到森林 ...
- FineUI大版本升级,外置ExtJS库、去AXD化、表格合计行、表格可编辑单元格的增删改、顶部菜单框架
这是一篇很长的文章,在开始正文之前,请允许我代表目前排名前 20 中唯一的 .Net 开源软件 FineUI 拉下选票: 投票地址: https://code.csdn.net/2013OSSurve ...
- WPF制作的小型笔记本-仿有道云笔记
楼主所在的公司不允许下载外部资源, 不允许私自安装应用程序, 平时记录东西都是用记事本,时间久了很难找到以前记的东西. 平时在家都用有道笔记, 因此就模仿着做了一个, 先看下实际运行图片: 1. 初始 ...
- nodejs学习之实现http数据转发
此前在做项目的时候,一直用json文件用作模拟数据,后来发现了mock.js,于是就用了mock.js,再后来感觉这些数据再怎么模拟都是静态数据.所以就想用nodejs实现一个数据转发功能,在本地拉取 ...
- OS存储器管理(二)
离散分配 分页(Paging),分段,段页式 一.分页 一个进程的物理地址可以是非连续的: 将物理内存分成固定大小的块,称为块(frame): 将逻辑内存分为同样大小的块,称为页(page): ...
- Myeclipse 2015 stable 2.0 完美破解方法
2015-08-21 以前写了一篇<Myeclipse 2015 stable 1.0 完美破解方法>,现 在跟新一下Myeclipse 2015 stable 2.0 破解方法,此方法 ...
- jquery里面的$(this)和this都什么时候用,有什么区别
当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! " + i ); 这个里的htm ...
- void与void之间没有隐式转换(纯属恶搞,请勿在意)
强大的vs弹出了这个提示:.有没有觉得强大的vs不应该出现该提示. 但就是出现了. 看客,您知道怎么让vs弹出这个提示吗^~^