ABC 363 E - Sinking Land 题解

用一个优先队列维护和海相邻的位置,每次海面上升就判断一下队列中海拔最低的那个位置会不会被淹没,如果会,就删除,同时它上下左右的位置也是和海相邻的(或者就在海里),把它们加进优先队列里,记得判断一下加入的格子曾经有没有被加入过队列,不要加重复了。

点击开 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;
}
posted @ 2024-07-20 21:28  fydj  阅读(69)  评论(0编辑  收藏  举报