Gromah and LZR have entered the fourth level. There is a blank cube with size n\times m\times hn×m×h hanging on the wall.
Gromah soon finds a list beside the cube, there are q_{}q instructions in the list and each instruction is in one of the following two formats:
2. (2,x, y, z)_{}(2,x,y,z), meaning to determine the minimum Manhattan Distance to the given position (x, y, z)_{}(x,y,z) among all tagged positions
Manhattan Distance between two positions (x_1, y_1, z_1), (x_2, y_2, z_2)(x1,y1,z1),(x2,y2,z2) is defined as |x_1 - x_2| + |y_1 - y_2| + |z_1 - z_2|∣x1−x2∣+∣y1−y2∣+∣z1−z2∣.
LZR also finds a note board saying that the password of this level is the sequence made up of all results of the instructions in format 2.
输入描述:
The first line contains four positive integers n,m,h,q_{}n,m,h,q, denoting the sizes in three dimensions of the cube and the number of instructions.Following q_{}q lines each contains four positive integers op,x, y, z_{}op,x,y,z, where op=1_{}op=1 means to add a tag on (x,y,z)_{}(x,y,z) while op=2_{}op=2 means to make a query on (x,y,z)_{}(x,y,z).1 \le n\times m\times h, q\le 10^5, 1 \le x \le n, 1 \le y \le m, 1 \le z \le h1≤n×m×h,q≤105,1≤x≤n,1≤y≤m,1≤z≤hIt is guaranteed that the first instruction is in format 1 and that no position will be tagged more than once.
输出描述:
For each instruction in format 2, output the answer in one line.
示例1
说明
For the first query, there is only one tagged position (1,1,1)_{}(1,1,1) currently, so the answer is |1-2| + |1-3| + |1-3| = 5_{}∣1−2∣+∣1−3∣+∣1−3∣=5.For the second query, (3,1,1)_{}(3,1,1) is the nearest tagged position, so the answer is |3-3| + |1-3| + |1-2| = 3_{}∣3−3∣+∣1−3∣+∣1−2∣=3.
定期bfs处理,期限内暴力枚举
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod=1e9+7;
const int modp=998244353;
const int maxn=1e5+50;
const double eps=1e-6;
#define lowbit(x) x&(-x)
#define INF 0x3f3f3f3f
const double inf=0x7fffffff;
inline ll read()
{
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int dcmp(double x)
{
if(fabs(x)<eps)return 0;
return (x>0)?1:-1;
}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
ll qmod(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
{
ans=(ans*a)%mod;
}
b>>=1;
a=(a*a)%mod;
}
return ans;
}
const int maxs=1000;
int dx[]= {1,-1,0,0,0,0};
int dy[]= {0,0,1,-1,0,0};
int dz[]= {0,0,0,0,1,-1};
int dis[maxn],n,m,h,q;
vector<int>X,Y,Z;
struct node
{
int x,y,z;
};
int myhash(int x,int y,int z)
{
return x*m*h+y*h+z;
}
void bfs()
{
queue<node>q;
for(int i=0; i<maxs; ++i)
{
dis[myhash(X[i],Y[i],Z[i])]=0;
q.push({X[i],Y[i],Z[i]});
}
while(!q.empty())
{
node tmp=q.front();
q.pop();
for(int i=0; i<6; ++i)
{
int nx=tmp.x+dx[i],ny=tmp.y+dy[i],nz=tmp.z+dz[i];
if(nx<0||ny<0||nz<0||nx>=n||ny>=m||nz>=h||dis[myhash(nx,ny,nz)]<=dis[myhash(tmp.x,tmp.y,tmp.z)]+1)continue;
dis[myhash(nx,ny,nz)]=dis[myhash(tmp.x,tmp.y,tmp.z)]+1;
q.push({nx,ny,nz});
}
}
X.clear();
Y.clear();
Z.clear();
}
int main()
{
scanf("%d%d%d%d",&n,&m,&h,&q);
int op,x,y,z,ans;
memset(dis,INF,sizeof(dis));
while(q--)
{
scanf("%d%d%d%d",&op,&x,&y,&z);
x--;y--;z--;
if(op==1)
{
X.push_back(x);
Y.push_back(y);
Z.push_back(z);
}
else
{
ans=dis[myhash(x,y,z)];
int len=X.size();
for(int i=0; i<len; i++)
{
ans=min(ans,abs(x-X[i])+abs(y-Y[i])+abs(z-Z[i]));
}
printf("%d\n",ans);
}
if(X.size()==maxs)
{
bfs();
}
}
return 0;
}

京公网安备 11010502036488号