用一个优先队列维护和海相邻的位置,每次海面上升就判断一下队列中海拔最低的那个位置会不会被淹没,如果会,就删除,同时它上下左右的位置也是和海相邻的(或者就在海里),把它们加进优先队列里,记得判断一下加入的格子曾经有没有被加入过队列,不要加重复了。
点击开 D
const int N=1099;
int n,m,q,h[N][N]={},ans;
bool ind[N][N]={};
struct note {
int x,y;
friend bool operator < (const note a,const note b) {
return h[a.x][a.y]>h[b.x][b.y];
}
}; priority_queue<note> que;
void put(int x,int y) {
if(x<1||y<1||x>n||y>m)
return ;
if(!ind[x][y])
que.push((note){x,y}),
ind[x][y]=true;
return ;
}
int main()
{
int i,j,x,y;
read(n,m,q);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
read(h[i][j]);
ans=n*m;
for(i=1;i<=n;++i)
put(i,1),put(i,m);
for(i=1;i<=m;++i)
put(1,i),put(n,i);
for(i=1;i<=q;++i) {
while(!que.empty()&&h[que.top().x][que.top().y]<=i)
--ans,x=que.top().x,y=que.top().y,que.pop(),
put(x+1,y),put(x,y+1),put(x-1,y),put(x,y-1);
printf("%d\n",ans);
}
return 0;
}