2019牛客暑期多校训练营(第八场)D-Distance 定期重构
题意:
在一个三维空间中,给出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 定期重构的更多相关文章
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第二场)J-Subarray(思维)
>传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
- 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)
题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...
随机推荐
- 依赖Anaconda环境安装TensorFlow库,避免采坑
TensorFlow™ 简介: TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示 ...
- 20140724 菜单制作:制表位(段落->制表位->)
1.菜单制作:制表位(段落->制表位->) 叶轩楠·········· 上海大学 轩楠叶·········· 上海大学 楠轩叶·········· 上海大学 选完后要选“设置” 2.光盘制 ...
- keepalive基础知识
一.LVS负载均衡集群的缺点 二.Keepalived介绍 三.Keepalived的功能 四.Keepalived工作原理 五.Keepalived组件框架 六.Keepalived的安装 6.1 ...
- Vuex篇
[Vuex篇] vuex源码你学会了吗? 我来免费教你!~ 1.vuex是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的 ...
- axios以form-data形式的传递参数遇到的坑
axios默认的Content-type是application/json;charset=UTF-8,如果想要以表单的形式传递参数,只要修改{headers:{'Content-Type':'app ...
- 一起感受HTML5和CSS3
Web设计师可以使用HTML4和CSS2.1完成一些很酷的东西.我们可以在不使用陈旧的基于table布局的基础上完成文档逻辑结构并创建内容丰富的网站.我们可以在不使用内联<font>和&l ...
- oh my zsh 如何启用插件
注 根据自己的需求启用插件.但是,插件具体实现什么功能就得自己看啦. 官网说明 实践 其实默认oh my zsh(以下简称zsh)已经在安装的时候就帮我们下载好了所有插件,只不过需要用户自己选择启用哪 ...
- css垂直居中设置
转载自大佬的文章:纯css实现垂直居中的几种方法(https://www.cnblogs.com/hutuzhu/p/4450850.html) 总结得很棒,有好几种方法自己没用过的,拷贝过来给自己看 ...
- linux 6 timezone修改
linux 6 / Amazon linux 因为正好在使用Amazon 的linux AMI 又遇到了需要修改系统时区这个case 所以就调查了一下修改方法,因为Amazon的linux版本是由A ...
- layui中load具体用法
遮盖窗体,demo: layer.load(,{ // content: "加载中...", shade: [0.4,'#000'], //0.1透明度的白色背景 time:* } ...