2648: SJY摆棋子

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 2459  Solved: 834
[Submit][Status][Discuss]

Description

这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格子可能有多个棋子。

Input

第一行两个数 N M
以后M行,每行3个数 t x y
如果t=1 那么放下一个黑色棋子
如果t=2 那么放下一个白色棋子

Output

对于每个T=2 输出一个最小距离

Sample Input

2 3
1 1
2 3
2 1 2
1 3 3
2 4 2

Sample Output

1
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

  1.  

Sample Input

Sample Output

  1.  

Sample Output

HINT

Source

Vani原创 欢迎移步 OJ2648

Solution

双倍经验题,KD Tree模板题

KD Tree是一种切割多维空间的数据结构,主要用于多维空间信息的搜索(范围搜索和最近邻搜索)

大体上每层按照不同的维度进行左右建树,分开平面上的点,本质还是一颗平衡二叉树

效率大概是$O(log^{2}N)$的,比较暴力的做法

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. int read()
  8. {
  9. int x=,f=; char ch=getchar();
  10. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  11. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
  12. return x*f;
  13. }
  14. #define maxn 500010
  15. int n,m,D;
  16. struct PointNode
  17. {
  18. int d[],mn[],mx[],l,r;
  19. PointNode(int x=,int y=) {l=r=;d[]=x;d[]=y;}
  20. bool operator < (const PointNode & A) const {return d[D]<A.d[D];}
  21. }p[maxn];
  22. int dis(PointNode a,PointNode b) {return abs(a.d[]-b.d[])+abs(a.d[]-b.d[]);}
  23. struct K_DTreeNode
  24. {
  25. int rt,ans;
  26. PointNode Point,tree[maxn<<];
  27. void Update(int now)
  28. {
  29. for (int i=; i<=; i++)
  30. {
  31. if (tree[now].l)
  32. 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]);
  33. if (tree[now].r)
  34. 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]);
  35. }
  36. }
  37. int BuildTree(int l,int r,int dd)
  38. {
  39. D=dd; int mid=(l+r)>>;
  40. nth_element(p+l,p+mid,p+r+);
  41. tree[mid]=p[mid];
  42. for (int i=; i<=; i++) tree[mid].mn[i]=tree[mid].mx[i]=tree[mid].d[i];
  43. if (l<mid) tree[mid].l=BuildTree(l,mid-,dd^);
  44. if (r>mid) tree[mid].r=BuildTree(mid+,r,dd^);
  45. Update(mid);
  46. return mid;
  47. }
  48. void Insert(int now,int dd)
  49. {
  50. if (Point.d[dd]>=tree[now].d[dd])
  51. if (tree[now].r) Insert(tree[now].r,dd^);
  52. else
  53. {
  54. tree[now].r=++n; tree[n]=Point;
  55. for (int i=; i<=; i++) tree[n].mn[i]=tree[n].mx[i]=tree[n].d[i];
  56. }
  57. else
  58. if (tree[now].l) Insert(tree[now].l,dd^);
  59. else
  60. {
  61. tree[now].l=++n; tree[n]=Point;
  62. for (int i=; i<=; i++) tree[n].mn[i]=tree[n].mx[i]=tree[n].d[i];
  63. }
  64. Update(now);
  65. }
  66. int dist(int p1,PointNode p)
  67. {
  68. int re=;
  69. for (int i=; i<=; i++) re+=max(,tree[p1].mn[i]-p.d[i]);
  70. for (int i=; i<=; i++) re+=max(,p.d[i]-tree[p1].mx[i]);
  71. return re;
  72. }
  73. void Query(int now,int dd)
  74. {
  75. int dl,dr,d0;
  76. d0=dis(tree[now],Point);
  77. if (d0<ans) ans=d0;
  78. if (tree[now].l) dl=dist(tree[now].l,Point); else dl=0x7f7f7f7f;
  79. if (tree[now].r) dr=dist(tree[now].r,Point); else dr=0x7f7f7f7f;
  80. if (dl<dr)
  81. {
  82. if (dl<ans) Query(tree[now].l,dd^);
  83. if (dr<ans) Query(tree[now].r,dd^);
  84. }
  85. else
  86. {
  87. if (dr<ans) Query(tree[now].r,dd^);
  88. if (dl<ans) Query(tree[now].l,dd^);
  89. }
  90. }
  91. void insert(PointNode _p){Point=_p; Insert(rt,);}
  92. void init(){rt=BuildTree(,n,);}
  93. int query(PointNode _p){Point=_p;ans=0x7fffffff; Query(rt,); return ans;}
  94. }KDT;
  95. int main()
  96. {
  97. // freopen("angel.in","r",stdin); freopen("angel.out","w",stdout);
  98. n=read(),m=read();
  99. for (int i=; i<=n; i++) p[i].d[]=read(),p[i].d[]=read();
  100. KDT.init();
  101. for (int i=; i<=m; i++)
  102. {
  103. int opt=read(),x=read(),y=read();
  104. if (opt==) KDT.insert(PointNode(x,y));
  105. if (opt==) printf("%d\n",KDT.query(PointNode(x,y)));
  106. }
  107. return ;
  108. }

模板是参考的zky学长的,zky学长好神%%%

【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree的更多相关文章

  1. 【BZOJ 2648】SJY摆棋子 & 【BZOJ 2716】【Violet 3】天使玩偶

    KDTree模板,双倍经验啦啦啦- #include<cstdio> #include<cstring> #include<algorithm> #define r ...

  2. 【34.25%】【BZOJ 2648】SJY摆棋子

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 2718  Solved: 931 [Submit][Status][Discuss] Descrip ...

  3. 【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶

    KD-Tree 传说中的kd树...前去膜拜了一下……写道模板题>_< 写kdtree的一些感想: 插入的时候是像可持久化线段树一样直接在最后开新节点,然后更新它所在的块.. 然而其实也是 ...

  4. BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)

    Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...

  5. BZOJ.2716.[Violet3]天使玩偶(K-D Tree)

    题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 ...

  6. [bzoj2648/2716]SJY摆棋子_KD-Tree

    SJY摆旗子 bzoj-2648 题目大意:平面上有n个黑子.有m个操作,可以下一颗白子,查询与曼哈顿距离下最近黑子之间的曼哈顿距离,或者下一颗黑子. 注释:$1\le n,m\le 5\cdot 1 ...

  7. 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= ...

  8. [bzoj2648/2716]SJY摆棋子

    平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000 用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...) #include< ...

  9. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

随机推荐

  1. vim一些常用的快捷键

    快速注释: Ctrl+v I // esc 打开文件 gf ctrl+o

  2. Html5的一些引擎使用感触

    记得在2011年的时候,51CTO曾经采访我对H5的看法,因为当时Html5小组和雷友的关系,感觉是一片大火的形式,当时我的看法是:第一盈利模式不清晰,第二硬件跟不上,第三技术不成熟. 第一和第二点很 ...

  3. 异常检测算法--Isolation Forest

    南大周志华老师在2010年提出一个异常检测算法Isolation Forest,在工业界很实用,算法效果好,时间效率高,能有效处理高维数据和海量数据,这里对这个算法进行简要总结. iTree 提到森林 ...

  4. FineUI大版本升级,外置ExtJS库、去AXD化、表格合计行、表格可编辑单元格的增删改、顶部菜单框架

    这是一篇很长的文章,在开始正文之前,请允许我代表目前排名前 20 中唯一的 .Net 开源软件 FineUI 拉下选票: 投票地址: https://code.csdn.net/2013OSSurve ...

  5. WPF制作的小型笔记本-仿有道云笔记

    楼主所在的公司不允许下载外部资源, 不允许私自安装应用程序, 平时记录东西都是用记事本,时间久了很难找到以前记的东西. 平时在家都用有道笔记, 因此就模仿着做了一个, 先看下实际运行图片: 1. 初始 ...

  6. nodejs学习之实现http数据转发

    此前在做项目的时候,一直用json文件用作模拟数据,后来发现了mock.js,于是就用了mock.js,再后来感觉这些数据再怎么模拟都是静态数据.所以就想用nodejs实现一个数据转发功能,在本地拉取 ...

  7. OS存储器管理(二)

    离散分配 分页(Paging),分段,段页式 一.分页   一个进程的物理地址可以是非连续的:   将物理内存分成固定大小的块,称为块(frame): 将逻辑内存分为同样大小的块,称为页(page): ...

  8. Myeclipse 2015 stable 2.0 完美破解方法

    2015-08-21  以前写了一篇<Myeclipse 2015 stable 1.0 完美破解方法>,现 在跟新一下Myeclipse 2015 stable 2.0 破解方法,此方法 ...

  9. jquery里面的$(this)和this都什么时候用,有什么区别

    当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! " + i ); 这个里的htm ...

  10. void与void之间没有隐式转换(纯属恶搞,请勿在意)

    强大的vs弹出了这个提示:.有没有觉得强大的vs不应该出现该提示. 但就是出现了. 看客,您知道怎么让vs弹出这个提示吗^~^