涉及的知识点挺多,但是大多是套路

1.求曼哈顿距离的最值一般对所有情况进行讨论

2.三维树状数组用来求前缀最大值

  1. /*
  2. 有一个三维坐标系(x,y,z),取值范围为[1,n],[1,m],[1,h],有两种操作
  3. 1.在三维坐标系上更新一个点(x1,y1,z1)
  4. 2.给定一个点(x2,y2,z2),问在坐标系上离该点Manhattan距离最短的点
  5. 即最小的 |x2-x1|+|y2-y1|+|z2-z1|
  6. 令 f=|x2-x1|+|y2-y1|+|z2-z1|,那么可以讨论去绝对值后f的八种情况
  7. f0=(x2+y2+z2)-(x1+y1+z1),x2>=x1,y2>=y1,z2>=z1
  8. f1=(x2+y2-z2)-(x1+y1-z1),x2>=x1,y2>=y1,x2<x1
  9. ...
  10. 考虑如何求每种情况的最小值
  11. 由于 x2+y2+z2 的值是固定的,只需要求出最大的符合条件的 x1+y1+z1即可,发现 x1<=x2 && y1<=y2 && z1<=z2这个条件刚好可以用三维树状数组来维护(求前缀最大值,单点更新)
  12. 同理 八种情况都可以用八颗三维树状数组来维护
  13. 另外 考虑 f1的条件 需要将 x1>x2转换成 n-x1+1<=n-x2+1 然后更新的是x1+y1-z1,查询的结果是最大的 x1+y1-z1
  14. 其他情况同理
  15. (由于n*m*h<=1e5,所以用一个三维转一维的方式来存储)
  16. */
  17. #include<bits/stdc++.h>
  18. using namespace std;
  19. #define maxn 300005
  20. void update(int &a,int b){a=min(a,b);}
  21. void Max(int &a,int b){a=max(a,b);}
  22. int n,m,h,q;
  23. struct Bit{
  24. int b[maxn];
  25. void init(){memset(b,-0x3f,sizeof b);}
  26. inline int id(int x,int y,int z){return x*m*h+y*h+z;}
  27. inline int lowbit(int x){return x&-x;}
  28. void update(int x,int y,int z,int val){//在[x,y,z]出更新值val
  29. for(int i=x;i<=n;i+=lowbit(i))
  30. for(int j=y;j<=m;j+=lowbit(j))
  31. for(int k=z;k<=h;k+=lowbit(k))
  32. Max(b[id(i,j,k)],val);
  33. }
  34. int query(int x,int y,int z){//查询<=x,<=y,<=z的最大值
  35. int res=-0x3f3f3f3f;
  36. for(int i=x;i;i-=lowbit(i))
  37. for(int j=y;j;j-=lowbit(j))
  38. for(int k=z;k;k-=lowbit(k))
  39. Max(res,b[id(i,j,k)]);
  40. return res;
  41. }
  42. }bit[];
  43.  
  44. int main(){
  45. for(int i=;i<;i++)
  46. bit[i].init();
  47. cin>>n>>m>>h>>q;
  48. int x,y,z,op;
  49. while(q--){
  50. scanf("%d%d%d%d",&op,&x,&y,&z);
  51. if(op==){//更新
  52. bit[].update(x,y,z,x+y+z);
  53. bit[].update(x,y,h-z+,x+y-z);
  54. bit[].update(x,m-y+,z,x-y+z);
  55. bit[].update(n-x+,y,z,-x+y+z);
  56. bit[].update(x,m-y+,h-z+,x-y-z);
  57. bit[].update(n-x+,y,h-z+,-x+y-z);
  58. bit[].update(n-x+,m-y+,z,-x-y+z);
  59. bit[].update(n-x+,m-y+,h-z+,-x-y-z);
  60. }
  61. else {
  62. int ans=0x3f3f3f3f;
  63. update(ans,x+y+z-bit[].query(x,y,z));
  64. update(ans,x+y-z-bit[].query(x,y,h-z+));
  65. update(ans,x-y+z-bit[].query(x,m-y+,z));
  66. update(ans,-x+y+z-bit[].query(n-x+,y,z));
  67. update(ans,x-y-z-bit[].query(x,m-y+,h-z+));
  68. update(ans,-x+y-z-bit[].query(n-x+,y,h-z+));
  69. update(ans,-x-y+z-bit[].query(n-x+,m-y+,z));
  70. update(ans,-x-y-z-bit[].query(n-x+,m-y+,h-z+));
  71. cout<<ans<<'\n';
  72. }
  73. }
  74. }

暴力三维树状数组求曼哈顿距离求最值——牛客多校第八场D的更多相关文章

  1. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  2. Distance(2019年牛客多校第八场D题+CDQ+树状数组)

    题目链接 传送门 思路 这个题在\(BZOJ\)上有个二维平面的版本(\(BZOJ2716\)天使玩偶),不过是权限题因此就不附带链接了,我也只是在算法进阶指南上看到过,那个题的写法是\(CDQ\), ...

  3. HDU - 3584 Cube (三维树状数组 + 区间改动 + 单点求值)

    HDU - 3584 Cube Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Subm ...

  4. 线段树区间离散化维护按秩合并并查集(可撤销)——牛客多校第八场E

    模板题..去网上学了可撤销的并查集.. /* 给定一个无向图,边的属性为(u,v,l,r),表示<u,v>可以通过的size为[l,r] 求出有多少不同的size可以从1->n 把每 ...

  5. Explorer(2019年牛客多校第八场E题+线段树+可撤销并查集)

    题目链接 传送门 题意 给你一张无向图,每条边\(u_i,v_i\)的权值范围为\([L_i,R_i]\),要经过这条边的条件是你的容量要在\([L_i,R_i]\),现在问你你有多少种容量使得你可以 ...

  6. 牛客多校第八场E Explorer(左开右闭线段树+可撤回并查集)题解

    题意: 传送门 有\(n\)个点构成一个无向图,每条边有\(L_i,R_i\)表示这条边只能允许编号为\(L_i\dots R_i\)的人通过,现在问你最多有几个人能从\(1\)走到\(n\). 思路 ...

  7. 1470. UFOs(三维树状数组)

    1470 最简单的三维树状数组 #include <iostream> #include<cstdio> #include<cstring> #include< ...

  8. HDU 3584 三维树状数组

    三维树状数组模版.优化不动了. #include <set> #include <map> #include <stack> #include <cmath& ...

  9. HDU 3584 Cube 【 三维树状数组 】

    题意:还是那篇论文里面讲到的,三维树状数组http://wenku.baidu.com/view/1e51750abb68a98271fefaa8画个立方体出来对照一下好想一点 #include< ...

随机推荐

  1. day07 python列表 集合 深浅拷贝

    day07 python   一.知识点补充     1."".join() s = "".join(('1','2','3','4','5'))  #将字符串 ...

  2. element-ui中table渲染的快速用法

    element-ui中对table数据的渲染有一些模板式的操作,基本按照模板渲染数据即可 基本模板样式如下 <el-table :data="studentData.rows" ...

  3. 微信小程序 封装接口

    1.util-util.js //封装接口 let baseURL = 'http://127.0.0.1:3000/'; //接口路径 let request = function (url, op ...

  4. php操作redis--字典(hash)篇

    常用函数:hSet,hGet,hGetAll等. 应用场景:存储用户信息对象数据,包括id,姓名,年龄和生日,通过用户id来获取姓名,年龄等信息. 连接 $redis = new Redis(); $ ...

  5. C#中ArrayList 、Array与、string、string[]数组的相关转换

    一.ArrayList 与 string.string[]数组的转换 1.ArrayList 转换为 string[] : ArrayList list = new ArrayList(); list ...

  6. Shiro学习(13)RememberMe

    Shiro提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下: 1.首先在登录页面选中Reme ...

  7. stl+数论——1247D

    其实也不算很难想,每个元素质因子分解后的p^c的p和c用pair的形式存在每个元素vector里 要去前面找一个数使得所有指数相加是k的倍数,那么把vector里的所有c 模 k,然后去找前面互补的数 ...

  8. elementUI拿到当前表格行的数据的另一种写法

    背景: 这里是通过点击“修改”按钮后才拿到当前行的数据,不是点击当前行任意位置拿到数据,所以不能用 @row-click 方法 改用点击的时候直接拿到这个表里面的这一条数据 1.绑定事件 <te ...

  9. AcWing 197. 阶乘分解 (筛法)打卡

    给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pipi 和 cici 即可. 输入格式 一个整数N. 输出格式 N! 分解质因数后的结果,共若干行,每行一对pi, ...

  10. docker IPv4 forwarding is disabled. 解决方法

    问题 最近在 docker 部署 django 项目打包镜像时遇到 [root@localhost ~]# docker build -t test1 . ...省略... WARNING: IPv4 ...