白令海峡思路

白令海峡

题目描述

很久很久以前,一座大陆桥横跨西伯利亚东端与美洲大陆西端。

处于进化早期的人类,正以部落的形式在大陆上游荡、捕猎,四海为家。在饥饿与寒冷折磨下,人们不断迁徙。在不知不觉中,也许有一支队伍、也许有许多支队伍,跨过了大陆桥,来到了美洲大陆。人类繁衍与进化的脚步自此迈上了美洲大陆。

然而,板块位移,地质变迁,陆地慢慢被大海淹没,广阔的海峡将亚欧大陆和美洲大陆的人类分隔开来。也许是万年,也许是十万年,两岸的人类才能再度相见。

大陆架可以看作一个 n×m 的矩形区域,区域内有一些格子已经被海洋所淹没。在接下来的 q 年里,区域内还有一些格子会逐个沉没。那么到底是哪一年两座大陆才会分隔开来呢?

输入格式

第一行一个整数 T 代表数据组数。

每组数据第一行两个整数 nm

接下来 n 行每行 m 个整数,为 1 表示已经被淹没,为 0 表示仍为陆地。

接下来一行一个整数 q

接下来 q 行每行两个整数,表示沉没的格子坐标。

输出格式

每组数据输出一行,代表答案。如果 q 年之后还连通,输出 -1

样例输入

1
4 6
011010
000010
100001
001000
7
0 3
1 5
1 3
0 0
1 2
2 4
2 1

样例输出

4

样例解释

image.png
到第 4 年,无法从上面到达下面。

第3年可以从上面走到下面,我们可以想象输入是一个连接着上方和下方的桥。

image.png

第0年,我们可以这么走:

image.png

数据规模

1≤T≤10,1≤n,m≤500,1≤q≤n×m,0≤x<n,0≤y<m


思路

看到这道题,首先我们想到的肯定是搜索,那么是 dfs 还是 bfs 呢?暂时不知道,先往后看。

根据题意, 0 表示没淹没, 1 表示淹没。

如果我们直接暴力,时间复杂度就是 O(nmq)\Rightarrow6.25\times10^{10} ,绝对会图片,我们需要时间复杂度更低的方法。

我们设两座大陆用 0 表示不分隔, 1 表示分隔,以这组数据为例:

1
4 6
011010
000010
100001
001000
7
0 3
1 5
1 3
0 0
1 2
2 4
2 1

那么,这个数列就是 \{0,0,0,1,1,1,1\}

我们的答案肯定就是这个数列中第一次出现 1 的时间了。

其实这题用的是二分,这样,时间复杂度就是 O(nm\log q) ,可以通过。

我们需要编写一个 bool 类型的函数,如 bool\space check(int\space mid); ,其中, bool 表示能否连通, mid 表示的是第 mid 年的情况。

那么, l 等于多少, r 等于多少呢?答: l=1,r=q

然后,搜索的起点和终点又是什么呢?答:起点是所有第 0 行且值为 0 的点,终点是所有第 n-1 行且值为 0 的点。

知道了思路后,这道题就迎刃而解了。

1 个赞