虽然是一道模拟题,但其实我们可以考虑用常数更小的 priority_queue 解决。
考虑 V_{i,j}Vi,j 表示格子种类 ii,紧密度为 jj 的 priority_queue。我们发现实际上如果在当前 priority_queue 中的最小值紧密度如果不是 jj 了就弹去,否则就放。这样做时间复杂度还是 O(5\times n^2 \log n)O(5×n2logn),空间复杂度 O(5\times n^2)O(5×n2),但因为 priority_queue 常数更小所以目前跑到了最优解。
//The Hunting Party - Keys To The Kingdom
//好想做嘉然小姐的狗啊~
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define mp make_pair
#define pa pair < int,int >
#define fi first
#define se second
#define inf 1e18
#define mod 998244353
//#define int ll
#define N 1005
using namespace std;
inline char gc(){static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
// #define gc getchar
inline ll read(){char c=gc();ll su=0,f=1;for (;c<'0'||c>'9';c=gc()) if (c=='-') f=-1;for (;c>='0'&&c<='9';c=gc()) su=su*10+c-'0';return su*f;}
inline void write(ll x){if (x<0){putchar('-');write(-x);return;}if (x>=10) write(x/10);putchar(x%10+'0');}
inline void writesp(ll x){write(x),putchar(' ');}
inline void writeln(ll x){write(x);putchar('\n');}
priority_queue<pa>G[15][15];
int n,m,v[N][N],jinmi[N][N],ans[N][N];
void What_will_Diana_eat_today()
{
n=read(),m=read();
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
v[i][j]=read();
}
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
jinmi[i][j]=(i==1||i==n)+(j==1||j==m);
G[v[i][j]][(i==1||i==n)+(j==1||j==m)].push(mp(-(i+j),-i));
}
for (int i=1;i<=n*m;i++)
{
int x=read();
bool bl=0;
for (int j=4;j>=0;j--)
{
if (G[x][j].empty()) continue;
while (!G[x][j].empty())
{
pa now=(G[x][j].top());
G[x][j].pop();
now.se=-now.se;
now.fi=-now.fi;
now.fi=now.fi-now.se;
swap(now.fi,now.se);
if (jinmi[now.fi][now.se]!=j||ans[now.fi][now.se]) continue;
ans[now.fi][now.se]=i;
if (now.fi>1)
{
jinmi[now.fi-1][now.se]++;
G[v[now.fi-1][now.se]][jinmi[now.fi-1][now.se]].push(mp(-(now.fi-1+now.se),-now.fi+1));
}
if (now.se>1)
{
jinmi[now.fi][now.se-1]++;
G[v[now.fi][now.se-1]][jinmi[now.fi][now.se-1]].push(mp(-(now.fi-1+now.se),-now.fi));
}
if (now.fi<n)
{
jinmi[now.fi+1][now.se]++;
G[v[now.fi+1][now.se]][jinmi[now.fi+1][now.se]].push(mp(-(now.fi+1+now.se),-now.fi-1));
}
if (now.se<m)
{
jinmi[now.fi][now.se+1]++;
G[v[now.fi][now.se+1]][jinmi[now.fi][now.se+1]].push(mp(-(now.fi+1+now.se),-now.fi));
}
bl=1;break;
}
if (bl) break;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++) writesp(ans[i][j]);
puts("");
}
}
signed main()
{
int T=1;
while (T--)
{
What_will_Diana_eat_today();
}
}
啦啦啦啦啦啦啦啦啦啦啦