Description

Input

Output

Sample Input

100 100
81 23
27 16
52 58
44 24
25 95
34 2
96 25
8 14
97 50
97 18
64 3
47 22
55 28
89 37
75 45
67 22
90 8
65 45
68 93
87 8
61 45
69 72
38 57
58 76
45 34
88 54
27 8
35 34
70 81
25 24
97 97
4 43
39 38
82 68
27 58
2 21
92 88
96 70
97 29
14 53
6 42
1 2
35 84
64 88
63 57
53 40
82 59
49 56
75 72
29 30
50 1
40 83
52 94
22 35
39 1
94 88
89 96
79 46
33 75
31 42
33 95
6 83
90 66
37 54
35 64
17 66
48 37
30 8
95 51
3 51
90 33
29 48
94 78
53 7
1 26
73 35
18 33
99 78
83 59
23 87
4 17
53 91
98 3
54 82
85 92
77 8
56 74
4 5
63 1
26 8
42 15
48 98
27 11
70 98
36 9
78 92
34 40
42 82
64 83
75 47
2 51 55
1 7 62
2 21 62
1 36 39
1 35 89
1 84 15
2 19 24
1 58 53
2 52 34
1 98 49
1 4 100
1 17 25
1 30 56
1 69 43
2 57 23
2 23 13
1 98 25
2 50 27
1 84 63
2 84 81
2 84 77
1 60 23
2 15 27
1 9 51
1 31 11
1 96 56
2 20 85
1 46 32
1 60 88
2 92 48
1 68 5
2 90 17
1 16 46
2 67 5
2 29 83
1 84 70
2 68 27
1 99 33
2 39 89
2 38 28
1 42 3
1 10 60
2 56 29
2 12 60
2 46 51
2 15 73
1 93 42
1 78 82
1 66 20
1 46 17
2 48 5
1 59 61
1 87 59
2 98 72
1 49 3
2 21 10
1 15 4
1 48 14
2 67 75
2 83 77
1 88 65
2 100 93
2 58 83
1 29 80
2 31 88
2 92 94
1 96 66
1 61 82
2 87 24
1 64 83
1 28 87
2 72 90
2 7 3
1 86 3
2 26 53
2 71 2
2 88 24
1 69 60
1 92 44
2 74 94
1 12 78
2 1 2
1 4 73
1 58 5
1 62 14
2 64 58
2 39 45
1 99 27
1 42 21
1 87 2
2 16 98
2 17 21
2 41 20
1 46 72
1 11 62
2 68 29
1 64 66
2 90 42
2 63 35
1 64 71

Sample Output

3
8
6
7
7
6
6
12
11
4
5
6
8
1
7
6
4
9
2
2
8
9
6
4
7
5
8
7
5
5
5
7
7
5
6
6
8
6
0
2
7
12
4
2
8
3
10

解题思路:

样例好良心。

写CDQ写腻了,这道题还是学一学KD-Tree吧。

KD-Tree,可以认为是在K维空间上二分答案。

将二分得到的顺序建树。

这样的结构很难支持修改,所以暴力插入。

应用替罪羊的想法,不优秀就暴力重建。

时间复杂度玄学。(维护矩形曼哈顿距离)

非常开心地AC

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. typedef long long lnt;
  5. const int D=;
  6. const int maxn=;
  7. const double alpha=0.75;
  8. int here;
  9. struct KD_pnt{
  10. int v[D];
  11. bool friend operator < (KD_pnt x,KD_pnt y)
  12. {
  13. return x.v[here]<y.v[here];
  14. }
  15. }p[maxn];
  16. struct KD_trnt{
  17. KD_pnt val;
  18. KD_pnt mx;
  19. KD_pnt mn;
  20. int ls;
  21. int rs;
  22. int wgt;
  23. }kt[maxn],stdkt;
  24. int n,m;
  25. int ans;
  26. int top;
  27. int siz;
  28. int root;
  29. int bin[maxn];
  30. inline int read(void)
  31. {
  32. int anss=,f=;
  33. char ch=getchar();
  34. while(ch<''||ch>'')
  35. {
  36. if(ch=='-')
  37. f=-f;
  38. ch=getchar();
  39. }
  40. while(ch>=''&&ch<='')
  41. {
  42. anss=anss*+ch-'';
  43. ch=getchar();
  44. }
  45. return anss*f;
  46. }
  47. int newp(void)
  48. {
  49. if(top)
  50. return bin[top--];
  51. return ++siz;
  52. }
  53. void Trash(int spc)
  54. {
  55. bin[++top]=spc;
  56. return ;
  57. }
  58. void apply(int &spc)
  59. {
  60. spc=newp();
  61. kt[spc]=stdkt;
  62. return ;
  63. }
  64. int Dist(KD_pnt a,KD_pnt b)
  65. {
  66. int ans=;
  67. for(int i=;i<D;i++)
  68. ans+=std::abs(a.v[i]-b.v[i]);
  69. return ans;
  70. }
  71. int assess(KD_pnt a,int spc)
  72. {
  73. int ans=;
  74. for(int i=;i<D;i++)
  75. ans+=std::max(,a.v[i]-kt[spc].mx.v[i])+std::max(,kt[spc].mn.v[i]-a.v[i]);
  76. return ans;
  77. }
  78. void pushup(int spc)
  79. {
  80. kt[spc].mx=kt[spc].mn=kt[spc].val;
  81. if(kt[spc].ls)
  82. {
  83. kt[spc].mx.v[]=std::max(kt[spc].mx.v[],kt[kt[spc].ls].mx.v[]);
  84. kt[spc].mn.v[]=std::min(kt[spc].mn.v[],kt[kt[spc].ls].mn.v[]);
  85. kt[spc].mx.v[]=std::max(kt[spc].mx.v[],kt[kt[spc].ls].mx.v[]);
  86. kt[spc].mn.v[]=std::min(kt[spc].mn.v[],kt[kt[spc].ls].mn.v[]);
  87. }
  88. if(kt[spc].rs)
  89. {
  90. kt[spc].mx.v[]=std::max(kt[spc].mx.v[],kt[kt[spc].rs].mx.v[]);
  91. kt[spc].mn.v[]=std::min(kt[spc].mn.v[],kt[kt[spc].rs].mn.v[]);
  92. kt[spc].mx.v[]=std::max(kt[spc].mx.v[],kt[kt[spc].rs].mx.v[]);
  93. kt[spc].mn.v[]=std::min(kt[spc].mn.v[],kt[kt[spc].rs].mn.v[]);
  94. }
  95. kt[spc].wgt=+kt[kt[spc].ls].wgt+kt[kt[spc].rs].wgt;
  96. return ;
  97. }
  98. void build(int l,int r,int dim,int &spc)
  99. {
  100. if(l>r)
  101. {
  102. spc=;
  103. return ;
  104. }
  105. apply(spc);
  106. here=dim;
  107. int mid=(l+r)>>;
  108. std::nth_element(p+l,p+mid,p+r+);
  109. kt[spc].val=p[mid];
  110. build(l,mid-,dim^,kt[spc].ls);
  111. build(mid+,r,dim^,kt[spc].rs);
  112. pushup(spc);
  113. return ;
  114. }
  115. void Destory(int spc,int sta)
  116. {
  117. if(kt[spc].ls)
  118. Destory(kt[spc].ls,sta);
  119. p[sta+kt[kt[spc].ls].wgt+]=kt[spc].val;
  120. Trash(spc);
  121. if(kt[spc].rs)
  122. Destory(kt[spc].rs,sta+kt[kt[spc].ls].wgt+);
  123. return ;
  124. }
  125. bool imbalance(int root)
  126. {
  127. return ((double)(std::max(kt[kt[root].ls].wgt,kt[kt[root].rs].wgt))>alpha*(double)(kt[root].wgt));
  128. }
  129. void rebuild(int &spc,int dim)
  130. {
  131. Destory(spc,);
  132. build(,kt[spc].wgt,dim,spc);
  133. return ;
  134. }
  135. void Insert(int &spc,KD_pnt x,int dim)
  136. {
  137. if(!spc)
  138. {
  139. apply(spc);
  140. kt[spc].val=x;
  141. pushup(spc);
  142. return ;
  143. }
  144. if(kt[spc].val.v[dim]<x.v[dim])
  145. Insert(kt[spc].rs,x,dim^);
  146. else
  147. Insert(kt[spc].ls,x,dim^);
  148. pushup(spc);
  149. if(imbalance(spc))
  150. rebuild(spc,dim);
  151. return ;
  152. }
  153. void Query(int spc,KD_pnt x)
  154. {
  155. if(!spc)
  156. return ;
  157. ans=std::min(ans,Dist(x,kt[spc].val));
  158. int disls,disrs;
  159. if(kt[spc].ls)
  160. disls=assess(x,kt[spc].ls);
  161. else
  162. disls=0x7f7f7f7f;
  163. if(kt[spc].rs)
  164. disrs=assess(x,kt[spc].rs);
  165. else
  166. disrs=0x7f7f7f7f;
  167. if(disls<disrs)
  168. {
  169. if(disls<ans)
  170. Query(kt[spc].ls,x);
  171. if(disrs<ans)
  172. Query(kt[spc].rs,x);
  173. }else{
  174. if(disrs<ans)
  175. Query(kt[spc].rs,x);
  176. if(disls<ans)
  177. Query(kt[spc].ls,x);
  178. }
  179. return ;
  180. }
  181. int main()
  182. {
  183. n=read();
  184. m=read();
  185. for(int i=;i<=n;i++)
  186. p[i].v[]=read(),p[i].v[]=read();;
  187. build(,n,,root);
  188. while(m--)
  189. {
  190. int cmd;
  191. KD_pnt x;
  192. ans=0x7f7f7f7f;
  193. cmd=read();
  194. x.v[]=read();
  195. x.v[]=read();
  196. if(cmd==)
  197. Insert(root,x,);
  198. else{
  199. Query(root,x);
  200. printf("%d\n",ans);
  201. }
  202. }
  203. return ;
  204. }

BZOJ2716: [Violet 3]天使玩偶(KD-Tree)的更多相关文章

  1. bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*

    bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...

  2. [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)

    [BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...

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

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

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

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

  5. bzoj2716: [Violet 3]天使玩偶

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  6. 【kd-tree】bzoj2716 [Violet 3]天使玩偶

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

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

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

  8. BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】

    题目 输入格式 输出格式 输入样例 //样例太长就不贴了.... 输出样例 //见原题 提示 题解 我们将曼哈顿距离式子中的绝对值去掉,每次只考虑x,y比当前点小的更新答案. 为了使所有点都对答案进行 ...

  9. BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

随机推荐

  1. MFC的执行过程分析

    MFC程序的执行细节剖析 MFC程序也是Windows程序,所以它应该也有一个WinMain.可是在程序中看不到它的踪影.事实上在程序进入点之前.另一个(并且仅有一个)全局对象(theApp).这就是 ...

  2. Android笔记三十四.Service综合实例二

    综合实例2:client訪问远程Service服务 实现:通过一个button来获取远程Service的状态,并显示在两个文本框中. 思路:如果A应用须要与B应用进行通信,调用B应用中的getName ...

  3. ipad无法连接到app store怎么办

    之前入手的air2提示无法连接到app store:你需要首先更新系统到最新的ios版本,去通用设置里面,有个update software, 点击即可,然后才能用apple id 联入,否选择提示连 ...

  4. SQL函数_Charindex()

    1 charindex()函数的作用是用于发现目标字符串第一次出现在源字符串中出现的开始位置. 语法如下 : select charinde(目标字符串,列名或字符串[,起始位置]) from 表名

  5. 如何在 Linux 上安装应用程序

    如何在 Linux 上安装应用程序 编译自:https://opensource.com/article/18/1/how-install-apps-linux作者: Seth Kenlon原创:LC ...

  6. subprocess模块使用

    subprocess 模块 一.简介 subprocess最早在2.4版本引入.用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值. subprocess用来替换多个旧模块 ...

  7. 微信、QQ中app的下载问题

    最近在做一个项目,有一项功能是从微信中的分享页或者产品推广页面中下载app:在微信中直接下载app时微信是“拒绝”的,所以一般的做法是点击下载按钮弹出遮罩层,提示在浏览器中打开,然后进入外部浏览器,再 ...

  8. jquery表单动态添加元素及PHP处理

    tijiao.php页面代码: if(isset($_POST['cp1'])){    echo '<pre>';    print_r($_POST); $num=((count($_ ...

  9. 【Uva 1631】Locker

    [Link]: [Description] 有一个n(n≤1000)位密码锁,每位都是0-9,可以循环旋转.每次可以让1-3个相邻 数字同时往上或者往下转一格.例如,567890->567901 ...

  10. LinkedHashMap<String, Bitmap>(0, 0.75f, true) LinkedHashMap的加载因子和初始容量分配

    今天上午在CSDN的论坛里看到有朋友提的问题如下: /** @param maxSize Maximum sum of the sizes of the Bitmaps in this cache * ...