@(BZOJ)[CDQ分治]





Sample Input

  1. 100 100
  2. 81 23
  3. 27 16
  4. 52 58
  5. 44 24
  6. 25 95
  7. 34 2
  8. 96 25
  9. 8 14
  10. 97 50
  11. 97 18
  12. 64 3
  13. 47 22
  14. 55 28
  15. 89 37
  16. 75 45
  17. 67 22
  18. 90 8
  19. 65 45
  20. 68 93
  21. 87 8
  22. 61 45
  23. 69 72
  24. 38 57
  25. 58 76
  26. 45 34
  27. 88 54
  28. 27 8
  29. 35 34
  30. 70 81
  31. 25 24
  32. 97 97
  33. 4 43
  34. 39 38
  35. 82 68
  36. 27 58
  37. 2 21
  38. 92 88
  39. 96 70
  40. 97 29
  41. 14 53
  42. 6 42
  43. 1 2
  44. 35 84
  45. 64 88
  46. 63 57
  47. 53 40
  48. 82 59
  49. 49 56
  50. 75 72
  51. 29 30
  52. 50 1
  53. 40 83
  54. 52 94
  55. 22 35
  56. 39 1
  57. 94 88
  58. 89 96
  59. 79 46
  60. 33 75
  61. 31 42
  62. 33 95
  63. 6 83
  64. 90 66
  65. 37 54
  66. 35 64
  67. 17 66
  68. 48 37
  69. 30 8
  70. 95 51
  71. 3 51
  72. 90 33
  73. 29 48
  74. 94 78
  75. 53 7
  76. 1 26
  77. 73 35
  78. 18 33
  79. 99 78
  80. 83 59
  81. 23 87
  82. 4 17
  83. 53 91
  84. 98 3
  85. 54 82
  86. 85 92
  87. 77 8
  88. 56 74
  89. 4 5
  90. 63 1
  91. 26 8
  92. 42 15
  93. 48 98
  94. 27 11
  95. 70 98
  96. 36 9
  97. 78 92
  98. 34 40
  99. 42 82
  100. 64 83
  101. 75 47
  102. 2 51 55
  103. 1 7 62
  104. 2 21 62
  105. 1 36 39
  106. 1 35 89
  107. 1 84 15
  108. 2 19 24
  109. 1 58 53
  110. 2 52 34
  111. 1 98 49
  112. 1 4 100
  113. 1 17 25
  114. 1 30 56
  115. 1 69 43
  116. 2 57 23
  117. 2 23 13
  118. 1 98 25
  119. 2 50 27
  120. 1 84 63
  121. 2 84 81
  122. 2 84 77
  123. 1 60 23
  124. 2 15 27
  125. 1 9 51
  126. 1 31 11
  127. 1 96 56
  128. 2 20 85
  129. 1 46 32
  130. 1 60 88
  131. 2 92 48
  132. 1 68 5
  133. 2 90 17
  134. 1 16 46
  135. 2 67 5
  136. 2 29 83
  137. 1 84 70
  138. 2 68 27
  139. 1 99 33
  140. 2 39 89
  141. 2 38 28
  142. 1 42 3
  143. 1 10 60
  144. 2 56 29
  145. 2 12 60
  146. 2 46 51
  147. 2 15 73
  148. 1 93 42
  149. 1 78 82
  150. 1 66 20
  151. 1 46 17
  152. 2 48 5
  153. 1 59 61
  154. 1 87 59
  155. 2 98 72
  156. 1 49 3
  157. 2 21 10
  158. 1 15 4
  159. 1 48 14
  160. 2 67 75
  161. 2 83 77
  162. 1 88 65
  163. 2 100 93
  164. 2 58 83
  165. 1 29 80
  166. 2 31 88
  167. 2 92 94
  168. 1 96 66
  169. 1 61 82
  170. 2 87 24
  171. 1 64 83
  172. 1 28 87
  173. 2 72 90
  174. 2 7 3
  175. 1 86 3
  176. 2 26 53
  177. 2 71 2
  178. 2 88 24
  179. 1 69 60
  180. 1 92 44
  181. 2 74 94
  182. 1 12 78
  183. 2 1 2
  184. 1 4 73
  185. 1 58 5
  186. 1 62 14
  187. 2 64 58
  188. 2 39 45
  189. 1 99 27
  190. 1 42 21
  191. 1 87 2
  192. 2 16 98
  193. 2 17 21
  194. 2 41 20
  195. 1 46 72
  196. 1 11 62
  197. 2 68 29
  198. 1 64 66
  199. 2 90 42
  200. 2 63 35
  201. 1 64 71

Sample Output

  1. 3
  2. 8
  3. 6
  4. 7
  5. 7
  6. 6
  7. 6
  8. 12
  9. 11
  10. 4
  11. 5
  12. 6
  13. 8
  14. 1
  15. 7
  16. 6
  17. 4
  18. 9
  19. 2
  20. 2
  21. 8
  22. 9
  23. 6
  24. 4
  25. 7
  26. 5
  27. 8
  28. 7
  29. 5
  30. 5
  31. 5
  32. 7
  33. 7
  34. 5
  35. 6
  36. 6
  37. 8
  38. 6
  39. 0
  40. 2
  41. 7
  42. 12
  43. 4
  44. 2
  45. 8
  46. 3
  47. 10

Solution

4 * CDQ分治

細節不要寫錯

這份代碼是TLE的, 原因貌似是常數過大QAQ

假如讀者有在代碼中發現任何問題, 懇請告知, 筆者將感激不盡.

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<climits>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. inline int read()
  8. {
  9. int x = 0, flag = 1;
  10. char c;
  11. while(! isdigit(c = getchar()))
  12. if(c == '-')
  13. flag *= - 1;
  14. while(isdigit(c))
  15. x = x * 10 + c - '0', c = getchar();
  16. return x * flag;
  17. }
  18. void println(int x)
  19. {
  20. if(x < 0)
  21. putchar('-'), x *= - 1;
  22. if(x == 0)
  23. putchar('0');
  24. int ans[1 << 4], top = 0;
  25. while(x)
  26. ans[top ++] = x % 10, x /= 10;
  27. for(; top; top --)
  28. putchar(ans[top - 1] + '0');
  29. putchar('\n');
  30. }
  31. const int N = 1 << 19, M = 1 << 19;
  32. const int LIM = 1 << 20;
  33. int n, m;
  34. struct vertex
  35. {
  36. int x, y, opt, ID, time;
  37. inline friend bool operator <= (vertex a, vertex b)
  38. {
  39. if(a.x == b.x)
  40. return a.opt <= b.opt;
  41. return a.x <= b.x;
  42. }
  43. }a[N + M], b[N + M], tmp[N + M];
  44. int ans[M];
  45. int T[LIM << 2];
  46. void modify(int u, int L, int R, int p, int x)
  47. {
  48. if(L + 1 == R)
  49. {
  50. T[u] = x;
  51. return;
  52. }
  53. int mid = L + R >> 1;
  54. if(p < mid)
  55. modify(u << 1, L, mid, p, x);
  56. else
  57. modify(u << 1 | 1, mid, R, p, x);
  58. T[u] = max(T[u << 1], T[u << 1 | 1]);
  59. }
  60. int query(int u, int L, int R, int p)
  61. {
  62. if(p + 1 >= R)
  63. return T[u];
  64. int mid = L + R >> 1;
  65. if(p < mid)
  66. return query(u << 1, L, mid, p);
  67. else
  68. return max(T[u << 1], query(u << 1 | 1, mid, R, p));
  69. }
  70. void cdq(int L, int R)
  71. {
  72. if(L + 1 >= R)
  73. return;
  74. int mid = L + R >> 1;
  75. cdq(L, mid), cdq(mid, R);
  76. for(int i = L; i < R; i ++)
  77. tmp[i] = b[i];
  78. int p1 = L, p2 = mid, p = L;
  79. while(p1 < mid && p2 < R)
  80. {
  81. if(b[p1] <= b[p2])
  82. tmp[p ++] = b[p1 ++];
  83. else
  84. tmp[p ++] = b[p2 ++];
  85. }
  86. while(p1 < mid)
  87. tmp[p ++] = b[p1 ++];
  88. while(p2 < R)
  89. tmp[p ++] = b[p2 ++];
  90. for(int i = L; i < R; i ++)
  91. b[i] = tmp[i];
  92. for(int i = L; i < R; i ++)
  93. {
  94. if(b[i].ID < mid && ! b[i].opt)
  95. modify(1, 0, LIM, b[i].y, b[i].x + b[i].y);
  96. else if(b[i].ID >= mid && b[i].opt)
  97. {
  98. int tmp = query(1, 0, LIM, b[i].y); //注意要特判
  99. if(tmp)
  100. ans[b[i].time] = min(ans[b[i].time], b[i].x + b[i].y - tmp);
  101. }
  102. }
  103. for(int i = L; i < R; i ++)
  104. if(b[i].ID < mid && ! b[i].opt)
  105. modify(1, 0, LIM, b[i].y, 0);
  106. }
  107. void cdqSolve1()
  108. {
  109. for(int i = 0; i < n + m; i ++)
  110. b[i] = a[i];
  111. cdq(0, n + m);
  112. }
  113. void cdqSolve2()
  114. {
  115. for(int i = 0; i < n + m; i ++)
  116. b[i] = a[i], b[i].y = LIM - a[i].y;
  117. cdq(0, n + m);
  118. }
  119. void cdqSolve3()
  120. {
  121. for(int i = 0; i < n + m; i ++)
  122. b[i] = a[i], b[i].x = LIM - a[i].x, b[i].y = LIM - a[i].y;
  123. cdq(0, n + m);
  124. }
  125. void cdqSolve4()
  126. {
  127. for(int i = 1; i <= n + m; i ++)
  128. b[i] = a[i], b[i].x = LIM - a[i].x;
  129. cdq(0, n + m);
  130. }
  131. int main()
  132. {
  133. #ifndef ONLINE_JUDGE
  134. freopen("BZOJ2716.in", "r", stdin);
  135. freopen("BZOJ2716.out", "w", stdout);
  136. #endif
  137. n = read(), m = read();
  138. for(int i = 0; i < n; i ++)
  139. a[i].x = read() + 1, a[i].y = read() + 1, a[i].opt = 0, a[i].ID = i, a[i].time = - 1;
  140. for(int i = 0; i < m; i ++)
  141. a[n + i].opt = read() - 1, a[n + i].x = read() + 1, a[n + i].y = read() + 1, a[n + i].ID = i + n, a[n + i].time = i;
  142. memset(ans, 127, sizeof(ans));
  143. memset(T, 0, sizeof(T));
  144. cdqSolve1(), cdqSolve2(), cdqSolve3(), cdqSolve4();
  145. for(int i = 0; i < m; i ++)
  146. if(a[i + n].opt)
  147. println(ans[i]);
  148. }

2716 [Violet 3] 天使玩偶的更多相关文章

  1. BZOJ 2716: [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 1473  Solved: 621[Submit][Statu ...

  2. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

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

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

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

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

  5. 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  6. bzoj 2716 [Violet 3]天使玩偶——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 第三道KDtree!仍旧是模板.还有CDQ分治做法,见下面. 数组迷之开大?(开6e5 ...

  7. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  8. BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree

    [题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...

  9. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

随机推荐

  1. shell脚本,如何破解字符串对应的md5sum前的RANDOM对应数字?

    已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?[root@localhost md5]# cat ...

  2. windows下使用gcc完成头文件和目标文件编译

    环境要求 安装了gcc win+r然后输入cmd , dos界面输入 gcc -v 查看有没有安装gcc 进入正题 新建 text.c文件键入如下代码: #include <stdio.h> ...

  3. 【贪心】bzoj1572: [Usaco2009 Open]工作安排Job

    先是没怎么理解这个贪心……然后贪心又被细节弄挂…… Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. ...

  4. mysql的字符串处理函数用法

    1.LOCATE函数 LOCATE(substr,str) 返回子串 substr 在字符串 str 中第一次出现的位置.如果子串 substr 在 str 中不存在,返回值为 0.如果substr或 ...

  5. MySQLfailover错误一则

    由于公司现有主库要转移到新的主库上,所以,我打算利用MySQLfailover工具的故障转移. 1.开发把程序账号转移到新主库上 2.停止现有主库,使之进行故障转移,转移期间会自动锁表,保持数据一致性 ...

  6. 【php】 PHP 支持 9 种原始数据类型

    PHP 支持 9 种原始数据类型. 四种标量类型: boolean(布尔型) integer(整型) float(浮点型,也称作 double) string(字符串) 三种复合类型: array(数 ...

  7. Ubuntu18.04 无法解析域名

    解决方法: 首先先输入以下4条命令 1. sudo lshw -numeric -class network2. sudo ifconfig -a3. sudo route -nv4. sudo dh ...

  8. Python9-day2 作业

    下列结果是什么? 6 or 2 >1     6 3 or 2 > 1  3 0 or 5<4  false 5 < 4 or 3  3 2 >1 or 6 True 3 ...

  9. 关于json的dump和dumps

    首先说明基本功能: dumps是将dict转化成str格式,loads是将str转化成dict格式. dump和load也是类似的功能,只是与文件操作结合起来了. 1.把python的数据,转换为js ...

  10. cdev结构体

    在内核源码include/linux/cdev.h里对cdev结构体的定义: struct cdev { struct kobject kobj; // 内嵌的kobject对象  struct mo ...