线段树.
一维时是经典问题,但我们常用的单调栈 + 线段树做法并不能比较方便的搬到二维上,需要考虑另外一种条件转化.
加入权值在区间 $[l,r]$ 内的格子,令它们的颜色为黑色,其它的格子颜色为白色.
考虑所有的 $(n+1)\times (m+1)$ 个 $2\times 2$ 的小正方形(超出边界也算),则所有黑色格子形成一个矩形,当且仅当恰好有 $4$ 个小正方形内部有 $1$ 个黑色格子,并且没有任何一个小正方形内部有 $3$ 个黑色格子.
必要性是显然的,任何一个由黑色格子组成的矩形都满足以上条件.充分性可以这样考虑,初始时一定是有 $4$ 个黑色格子,要求恰好有 $4$ 个小正方形内部有 $1$ 个黑色格子,就必须用黑色格子将它们连起来,形成矩形的边界,而此时角的地方会出现包含 $3$ 个黑色格子的小正方形,只有将内部全部填满后才会消失,于是可以得出这个条件是充分必要的.
有了这个结论,再来考虑如何计算答案.我们从小到大枚举 $r$ ,并对每个 $l\le r$ 维护 $f(l)$ ,表示将权值在 $[l,r]$ 内的格子染黑后,有多少个小正方形内部有 $1$ 个或 $3$ 个黑色格子.不难发现 $f(l)\ge 4,f(r)=4$ 是恒成立的,根据上面的结论,我们只需要求有多少个 $f(l)=4$ ,即最小值的个数.
用线段树维护 $f$ 以及最小值个数,每次 $r$ 增加 $1$ 时,会影响到周边的 $4$ 个 $2\times 2$ 的小正方形,在线段树上区间加即可.
时间复杂度 $O(nm\log nm)$ .
1 | //%std |