P4169 [Violet]天使玩偶/SJY摆棋子

CDQ分治的题目.

我们发现题目要我们求的\(|A_x-B_x|+|A_y-B_y|\)的绝对值号比较恶心.

试想一下怎么去掉

如果所有的点都在我们当前求的点的左下方(就是只考虑在他坐下方的点对他的贡献). 我们怎么求?

那么就要我们求\(min{A_x-B_x+A_y-B_y}\)(假设\(A\)为询问的点)

那么其实就是让我们求\(A_x+A_y-max(B_x+B_y)\)

也因为要满足左下角的限制

其实就是满足

\(B_x<=A_x\)同时满足\(B_y<=A_y\)中最大的\(B_x+B_y\)

这个是可以直接CDQ的

但是我们只考虑了左下方的点对他的贡献,很明显,这是不够的

那么我们就想办法依次将左上,右上,右下全部转化为左下

就是通过同最大值域的加减来改变他们的左边但不改变相对关系

注意常数就好了

另外,这种情况下归并排序的时间复杂度比快排优秀太多了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 6e5 + 3;
  4. const int M = 1e6 + 3;
  5. const int INF = 2e9;
  6. int n,m;
  7. int max_x,max_y;
  8. int ans[N];
  9. struct Q{
  10. int type;
  11. int id;
  12. int xi;
  13. int yi;
  14. int ans;
  15. }q[N],p[N],h[N];
  16. Q g[N];
  17. struct BIT{
  18. int c[M];
  19. inline void ins(int x,int v){
  20. for(;x <= max_y;x += x & -x) c[x] = max(c[x],v);
  21. }
  22. inline int query(int x){
  23. int res = 0;
  24. for(;x;x -= x & -x) res = max(res,c[x]);
  25. return res;
  26. }
  27. inline void clear(int x){
  28. for(;x <= max_y;x += x & -x) c[x] = 0;
  29. }
  30. }T;
  31. int xx[N],yy[N];
  32. inline bool cmp1(Q x,Q y){
  33. return x.id < y.id;
  34. }
  35. inline bool cmp2(Q x,Q y){
  36. if(x.xi != y.xi)
  37. return x.xi < y.xi;
  38. return x.yi < y.yi;
  39. }
  40. inline int read(){
  41. int x = 0;int flag = 0;
  42. char ch = getchar();
  43. while(!isdigit(ch)){
  44. if(ch == '-') flag = 1;
  45. ch = getchar();
  46. }
  47. while(isdigit(ch)){
  48. x = (x<<1) + (x<<3) + (ch^'0');
  49. ch = getchar();
  50. }
  51. if(flag) x = -x;
  52. return x;
  53. }
  54. inline void solve(int l,int r){
  55. if(l == r) return;
  56. int mid = (l + r) >> 1;
  57. solve(l,mid);solve(mid + 1,r);
  58. //sort(p + l,p + mid + 1,cmp2);
  59. //sort(p + mid + 1,p + r + 1,cmp2);
  60. // nj printf("%d %d\n",l,r);
  61. int now = l;
  62. int ll = l,rr = mid + 1,nn = l - 1;
  63. // cout << 1 << endl;
  64. for(int i = mid + 1;i <= r;++i){
  65. while(i <= r && p[i].type != 2) ++i;
  66. if(i > r) break;
  67. for(;now <= mid && p[now].xi <= p[i].xi;++now) if(p[now].type == 1) T.ins(p[now].yi,p[now].xi + p[now].yi);
  68. int t = T.query(p[i].yi);
  69. if(t) ans[p[i].id] = min(ans[p[i].id],p[i].xi + p[i].yi - t);
  70. }
  71. for(int i = l;i < now;++i) if(p[i].type == 1) T.clear(p[i].yi);
  72. while(ll <= mid && rr <= r){
  73. if(p[ll].xi <= p[rr].xi) h[++nn] = p[ll++];
  74. else h[++nn] = p[rr++];
  75. }
  76. while(ll <= mid) h[++nn] = p[ll++];
  77. while(rr <= r) h[++nn] = p[rr++];
  78. for(int i = l;i <= r;++i) p[i] = h[i];
  79. }
  80. inline void del(){
  81. int rx = 0,ry = 0;m = 0;
  82. for(int i = 1;i <= n;++i)
  83. if(p[i].type == 1) rx = max(p[i].xi,rx),ry = max(p[i].yi,ry);
  84. for(int i = 1;i <= n;++i){
  85. if((p[i].xi <= rx && p[i].yi <= ry) || p[i].type == 2) g[++m] = p[i];
  86. }
  87. for(int i = 1;i <= m;++i) p[i] = g[i];
  88. }
  89. int main(){
  90. n = read(),m = read();
  91. for(int i = 1;i <= n;++i){
  92. q[i].xi = read() + 1,q[i].yi = read() + 1;
  93. max_x = max(max_x,q[i].xi),max_y = max(max_y,q[i].yi);
  94. q[i].id = i;
  95. q[i].type = 1;
  96. }
  97. for(int i = 1;i <= m;++i){
  98. q[n + i].type = read();q[n + i].xi = read() + 1;q[n + i].yi = read() + 1;
  99. q[n + i].id = i + n;
  100. max_x = max(max_x,q[n + i].xi),max_y = max(max_y,q[n + i].yi);
  101. }
  102. n += m;
  103. for(int i = 1;i <= n;++i) p[i] = q[i];
  104. for(int i = 1;i <= n;++i) ans[i] = INF;
  105. max_y = max(max_x,max_y) + 1;
  106. solve(1,n);
  107. for(int i = 1;i <= n;++i) p[i] = q[i],p[i].xi = max_y - p[i].xi;
  108. solve(1,n);
  109. for(int i = 1;i <= n;++i) p[i] = q[i],p[i].yi = max_y - p[i].yi;
  110. solve(1,n);
  111. for(int i = 1;i <= n;++i) p[i] = q[i],p[i].xi = max_y - p[i].xi,p[i].yi = max_y - p[i].yi;
  112. solve(1,n);
  113. for(int i = 1;i <= n;++i) if(ans[i] != INF) printf("%d\n",ans[i]);
  114. return 0;
  115. }

天使玩偶/SJY摆棋子的更多相关文章

  1. bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...

  2. 【LG4169】[Violet]天使玩偶/SJY摆棋子

    [LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...

  3. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  4. luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree

    P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...

  5. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

  6. [Violet]天使玩偶/SJY摆棋子 [cdq分治]

    P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...

  7. P4169 [Violet]天使玩偶/SJY摆棋子

    题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...

  8. LG4169 [Violet]天使玩偶/SJY摆棋子

    题意 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇 ...

  9. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子

    %%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...

随机推荐

  1. iOS 9 新特性之实现 3D Touch

    http://www.cocoachina.com/ios/20151027/13812.html 10月19号,周末,起床去吃早餐,吃完回来顺便去沃尔玛逛逛,把晚上的菜给买了,逛着逛着就来到了卖苹果 ...

  2. python 利用pandas导入数据

  3. twitter、facebook、pinterest、linkedin 分享代码

    twitter.facebook.pinterest.linkedin 分享代码 http://www.cnblogs.com/adstor-Lin/p/3994449.html

  4. TreeSet之用外部比较器实现自定义有序(重要)

    Student.java package com.sxt.set5; public class Student{ private String name; private int age; priva ...

  5. Kafka数据迁移MaxCompute最佳实践

    摘要: 本文向您详细介绍如何使用DataWorks数据同步功能,将Kafka集群上的数据迁移到阿里云MaxCompute大数据计算服务. 前提条件 搭建Kafka集群 进行数据迁移前,您需要保证自己的 ...

  6. Android Xutils框架HttpUtil Get请求缓存问题

    话说,今天和服务器开发人员小小的逗逼了一下,为啥呢? 话说今天有个"收藏产品"的请求接口,是get request的哦,我客户端写好接口后,点击"收藏按钮",返 ...

  7. oracle用UNION替换OR (适用于索引列)

    通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你 ...

  8. background背景色

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. JavaScript中判断整数的方法

    一.使用取余运算符判断 任何整数都会被1整除,即余数是0.利用这个规则来判断是否是整数. 1 2 3 4 5 function isInteger(obj) {     return obj%1 == ...

  10. Python--day29--configparser模块(配置)(不熟,以后要找时间重学)