Description
给出一张 n×mn \times mn×m 的网格,在其中删去 ccc 个格子,问至少再删去几个能使得图上存在两点不连通,或输出无解。
多组询问,询问组数 TTT 。
1≤T≤20,1≤n,m≤109,∑c≤1051 \leq T \leq 20,1 \leq n, m \leq 10^{9}, \sum c \leq 10^{5} 1≤T≤20,1≤n,m≤109,∑c≤105
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SOLUTION
观察题目,容易发现答案只会在 −1,0,1,2-1,0,1,2−1,0,1,2 之间 ,那么就可以随机输出其中一个数,以 14T\frac{1}{4^{T}}4T1 的概率通过这道题 。
那么分类讨论。
* 如果答案为 -1 ,显然只有两种情况: 只有剩一个格子,或者只有两个格子且两个格子相邻。这些是可以直接特判的。
* 如果答案为 0 , 显然是原图已经出现了不连通的状况。
* 若果答案为 1 ,那么原图存在一个点,使得删去这个点后图不联通,即原图存在割点。
* 否则答案为 2 。
由于坐标过大,我们不能直接在原图上求解,考虑离散。其实注意到网格上留有的格子有用的只是与每个删掉的格子八连通的格子。
我们可以把这些格子留下来建图。不过有一种特殊的情况,那就是边界问题,举一个例子
源代码
如题原本是一个 5×55 \times 55×5 的格子,在 (3,5)(3,5)(3,5) 被删掉了一个格子,如果我们只考虑八连通,那么就会出现 X\mathrm{X}X 是一个割点,然而在原图中并不是,所以就考虑将一个被删除的点的周围 5×55 \times 55×5 的格子 (共 24 个) 都拿下来建新图。这样点数是 O(24∑c)O\left(24 \sum c\right)O(24∑c)的。
特判掉 −1,0-1,0−1,0 之后,就跑一遍 tarjan\operatorname{tarjan}tarjan 判是否有割点即可。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CODE
我用了 map,在 luogu 上过不去... (bzoj 过了就苟且偷生...233333...