题目大意:给你一个n*m的格子,有些格子有障碍,要你找到一个最小的正方形格子,使得这个正方形没有覆盖障碍且去掉这个正方形后(1,1)与(n,m)就不连通了
n<=1500 m<=1500
这题首先要找到从起点到终点的左手路径与右手路径,左手路径就是用左手一直扶着墙壁走,右手路径就是用右手一直扶着墙壁走。如果一个正方形可以覆盖左右手路径就能让他不连通
首先暴搜每个点,把它作为正方形的右上角点,再找到一个最小的边长,mw,使得这个正方形可以阻断(如果任意的合法的mw都不能使得其阻断,就是最大的合法的边长),
如果这个正方形可以阻断,且这个正方形中没有障碍就可以用mw来更新答案了。
我开始的做法是二分找mw,结果发现慢的飞起,是O(n^2logn)的,后来经过仔细研究终于找到了一种去除log的方法
对于一个点(i,j)它的mw是k,那么(i,j+1)的mw<=k+1,这个是很显然的,因为以(i,j+1)为右上角,边长为k+1的正方形是包含以(i,j)为右上角,边长为k的正方形的
所以我们每次求一个点的mw时,就把上一个点的mw+1,在while mw-1也可以阻断路径时就把mw-1,这样就可以求出mw了,因为mw只加了n^2次,所以复杂度是O(n^2)
#include<cmath>
#include<cstdio>
#include<cstring&g