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

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

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

/*
有一个三维坐标系(x,y,z),取值范围为[1,n],[1,m],[1,h],有两种操作
1.在三维坐标系上更新一个点(x1,y1,z1)
2.给定一个点(x2,y2,z2),问在坐标系上离该点Manhattan距离最短的点
即最小的 |x2-x1|+|y2-y1|+|z2-z1|
令 f=|x2-x1|+|y2-y1|+|z2-z1|,那么可以讨论去绝对值后f的八种情况
f0=(x2+y2+z2)-(x1+y1+z1),x2>=x1,y2>=y1,z2>=z1
f1=(x2+y2-z2)-(x1+y1-z1),x2>=x1,y2>=y1,x2<x1
...
考虑如何求每种情况的最小值
由于 x2+y2+z2 的值是固定的,只需要求出最大的符合条件的 x1+y1+z1即可,发现 x1<=x2 && y1<=y2 && z1<=z2这个条件刚好可以用三维树状数组来维护(求前缀最大值,单点更新)
同理 八种情况都可以用八颗三维树状数组来维护
另外 考虑 f1的条件 需要将 x1>x2转换成 n-x1+1<=n-x2+1 然后更新的是x1+y1-z1,查询的结果是最大的 x1+y1-z1
其他情况同理
(由于n*m*h<=1e5,所以用一个三维转一维的方式来存储)
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
void update(int &a,int b){a=min(a,b);}
void Max(int &a,int b){a=max(a,b);}
int n,m,h,q;
struct Bit{
int b[maxn];
void init(){memset(b,-0x3f,sizeof b);}
inline int id(int x,int y,int z){return x*m*h+y*h+z;}
inline int lowbit(int x){return x&-x;}
void update(int x,int y,int z,int val){//在[x,y,z]出更新值val
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=m;j+=lowbit(j))
for(int k=z;k<=h;k+=lowbit(k))
Max(b[id(i,j,k)],val);
}
int query(int x,int y,int z){//查询<=x,<=y,<=z的最大值
int res=-0x3f3f3f3f;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
for(int k=z;k;k-=lowbit(k))
Max(res,b[id(i,j,k)]);
return res;
}
}bit[]; int main(){
for(int i=;i<;i++)
bit[i].init();
cin>>n>>m>>h>>q;
int x,y,z,op;
while(q--){
scanf("%d%d%d%d",&op,&x,&y,&z);
if(op==){//更新
bit[].update(x,y,z,x+y+z);
bit[].update(x,y,h-z+,x+y-z);
bit[].update(x,m-y+,z,x-y+z);
bit[].update(n-x+,y,z,-x+y+z);
bit[].update(x,m-y+,h-z+,x-y-z);
bit[].update(n-x+,y,h-z+,-x+y-z);
bit[].update(n-x+,m-y+,z,-x-y+z);
bit[].update(n-x+,m-y+,h-z+,-x-y-z);
}
else {
int ans=0x3f3f3f3f;
update(ans,x+y+z-bit[].query(x,y,z));
update(ans,x+y-z-bit[].query(x,y,h-z+));
update(ans,x-y+z-bit[].query(x,m-y+,z));
update(ans,-x+y+z-bit[].query(n-x+,y,z));
update(ans,x-y-z-bit[].query(x,m-y+,h-z+));
update(ans,-x+y-z-bit[].query(n-x+,y,h-z+));
update(ans,-x-y+z-bit[].query(n-x+,m-y+,z));
update(ans,-x-y-z-bit[].query(n-x+,m-y+,h-z+));
cout<<ans<<'\n';
}
}
}

暴力三维树状数组求曼哈顿距离求最值——牛客多校第八场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. JavaScript性能优化之摇树

    作者|Jeremy Wagner译者|薛命灯 现代 Web 应用程序可能会变得非常巨大,特别是它们的 JavaScript 部分.HTTP Archive 网站的数据显示,截至 2018 年中,传输到 ...

  2. BD贴吧图片爬虫

    #encoding:utf-8 import urllib import urllib.request from lxml import etree class Spider(object): def ...

  3. 管理员技术(三): 配置静态网络地址、 使用yum软件源 、 升级Linux内核、查找并处理文件、查找并提取文件内容

    一. 配置静态网络地址 目标: 本例要求为虚拟机 server 配置以下静态地址参数: 1> 主机名:server0.example.com    2> IP地址:172.25.0.11  ...

  4. noip提高组 2010 关押罪犯 (洛谷1525)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  5. fatal error C1189: #error : "No Target Architecture" 解决办法一

    在编译程序的时候发现报这个错误,在网上看到很多文章,说设置include路径,lib目录等等,都没有解决.最后调整了以下include文件的顺序,问题解决了.例如 从头文件a.h中截取的一段 type ...

  6. 如何在普通用户权限cmd怎么使用命令行变为管理员权限

    这两天在弄MySql,由于我下载的是免安装版本,环境自己配置了一下.有强迫症不喜欢某些服务打开在我不需要的时候,我一般都设置为手动,但是每次使用数据库时都要使用net start mysql启动MyS ...

  7. 架构-Java-Netty:Netty框架

    ylbtech-架构-Java-Netty:Netty框架 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网 ...

  8. 替换war包中的文件

    原文:https://blog.csdn.net/wuawua1/article/details/53906700 1.如果要替换的文件直接在war包的根目录(一级目录)下,直接使用jar uvf命令 ...

  9. 使用VS2015制作安装包( 含相关的下载链接)

    补充: 在看下面的教程过程中,如果在下面的步聚1中没有 " Visual Studio Installer", 则需要通过下面的链接进行安装 Visual Studio Insta ...

  10. Cuckoo架构

    cuckoo在部署阶段,只在Guest系统里塞了一个agent,这个agent在运行阶段负责与Host端程序进行通信,从Host端接收sample, 整个客户端程序,以及配置文件. 在Host端主要的 ...