题目传送门

题意:

  在一个三维空间中,给出q次操作,每次操作可以在空间中加上一个固定点,或者询问一个点,对于一个询问操作,输出距离这个点最近的固定点的曼哈顿距离。

思路:

  官方题解:先假设所有询问都在加标记之后,那么我们可以同过一次bfs求出网格中每个点离最近标记点的距离,询问就可以O(1)回答。

  现在考虑定期重构处理增量标记,记一个新增标记队列,每次拿出bfs预处理之后的结果,在暴力枚举队列中每一个新标记,这些结果取个min即可。

  当队列元素超过一个阈值E时,我们把队列中的标记也进行bfs,更新每个位置的答案,清空新增标记队列。

  克制复杂度是O(qnmh/E+qE),当E=根号nmh时取最小。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,b,a) for(int i=b;i>=a;i--)
#define clr(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pii pair<int,int >
using namespace std;
const int maxn=;
const int inf=0x3f3f3f3f;
int dis[maxn];
int n,m,h;
int getid(int x,int y,int z){
return (x-)*m*h+(y-)*h+z;
} int dir[][]={{,,},{-,,},{,,},{,-,},{,,},{,,-}};
struct node{
int x,y,z;
};
int getdis(node a,node b){
return abs(a.x-b.x)+abs(a.y-b.y)+abs(a.z-b.z);
}
vector<node >ve;
queue<node >q;
int main(){
int qi;
cin>>n>>m>>h>>qi;
int sq=sqrt(1ll*n*m*h);
int si=;
clr(dis,inf);
rep(i,,qi){
int op,x,y,z;
scanf("%d%d%d%d",&op,&x,&y,&z);
if(op==){
ve.pb({x,y,z});
si++;
if(si==sq){
rep(i,,si-){
q.push(ve[i]);
dis[getid(ve[i].x,ve[i].y,ve[i].z)]=;
}
while(!q.empty()){
node st=q.front();
q.pop();
rep(i,,){
int xx=st.x+dir[i][];
int yy=st.y+dir[i][];
int zz=st.z+dir[i][];
if(xx<||xx>n||yy<||yy>m||zz<||zz>h)continue;
if(dis[getid(xx,yy,zz)]>dis[getid(st.x,st.y,st.z)]+){
dis[getid(xx,yy,zz)]=dis[getid(st.x,st.y,st.z)]+;
q.push({xx,yy,zz});
}
}
}
ve.clear();
si=;
}
}else{
int ans=dis[getid(x,y,z)];
rep(i,,si-){
ans=min(ans,getdis({x,y,z},ve[i]));
}
printf("%d\n",ans);
}
}
}

2019牛客暑期多校训练营(第八场)D-Distance 定期重构的更多相关文章

  1. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  2. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  3. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  4. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  5. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  6. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  7. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 2019牛客暑期多校训练营(第二场)J-Subarray(思维)

    >传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...

  9. 2019牛客暑期多校训练营(第一场)-A (单调栈)

    题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...

  10. 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)

    题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...

随机推荐

  1. ajax中的onload和readychange区别

    先补个知识点: readyState 状态码: 0:请求未初始化 1:服务器连接已建立 2:请求已接受 3:请求处理中 4:请求已完成,且响应已就绪 HTTP 状态码: 200 - 服务器成功返回网页 ...

  2. 借用数组对象的prototype给数组扩充降维方法

    原理:只要是一个对象,他都有一个prototype原型对象,保存共有的属性和方法. <!DOCTYPE html> <html lang="en"> < ...

  3. K-mean matlab 实现代码

    一.K均值聚类算法 算法步骤如下: 1.初始化 已知数据集合X,及事先指定聚类的总类数N,在X中随机选取N个对象作为初始的聚类中心. 2.设定迭代终止条件 通常设置最大循环次数或者聚类中心的变化误差. ...

  4. Mac电脑最常见的办公软件是什么?Notion for Mac多功能办公笔记软件使用方法

    Notion for Mac是一款最新的高效率.办公类软件,相信许多用户在办公的时候需要打开特别多的在线工具,譬如Google Drive.Dropbox Paper.Confluence.GitHu ...

  5. scala对象简单记录

    object Person { private val eyeNum = 2 def getEyeNum = eyeNum def main(args: Array[String]): Unit = ...

  6. focus /focusin /focusout /blur 事件

    事件触发时间 focus:当focusable元素获得焦点时,不支持冒泡:focusin:和focus一样,只是此事件支持冒泡:blur:当focusable元素失去焦点时,不支持冒泡:focusou ...

  7. Android下载Android源码

    使用Git,命令是:git clone http://android.googlesource.com/platform/frameworks/base.git

  8. Nmap扫描与Tcpdump抓包分析

    扫描与抓包分析 3.1 问题 本案例要求熟悉Linux主机环境下的常用安全工具,完成以下任务操作: 使用NMAP扫描来获取指定主机/网段的相关信息 使用EtterCAP截获明文通信的密码.检测非加密通 ...

  9. BZOJ 1415: [Noi2005]聪聪和可可(记忆化搜索+期望)

    传送门 解题思路 还是比较简答的一道题.首先\(bfs\)把每个点到其他点的最短路求出来,然后再记忆化搜索.记搜的时候猫的走法是确定的,搜一下老鼠走法就行了. 代码 #include<iostr ...

  10. hdu多校第六场1012 (hdu6645) Stay Real 假博弈,真贪心

    题意: 给你一个小根堆,从根开始拿,拿走子节点被拿完后才可以拿走父节点,两个人依次拿,谁拿的节点总和大谁获胜,问你谁有必胜策略. 题解: 小根堆中,每个点的权值总是不小于父亲节点的权值.所以无论怎么取 ...