CF1534F2 Falling Sand (Hard Version)

题目描述

这是该问题的困难版本。不同版本的区别在于 $a_i$ 的约束条件。只有当所有版本的问题都被解决时,你才能进行 hack。 Little Dormi 最近从朋友那里收到了一道谜题,需要你的帮助来解决它。 这个谜题由一个竖直的棋盘组成,棋盘有 $n$ 行 $m$ 列,每个格子要么是空的,要么填有一块沙子,并且给定 $m$ 个非负整数 $a_1,a_2,\ldots,a_m$($0 \leq a_i \leq n$)。在本题版本中,$a_i$ 总是不大于第 $i$ 列中沙子的数量。 当某个格子中的沙块被扰动时,这块沙子会从它所在的格子落到该列底部的沙子计数器中(每列都有一个沙子计数器)。在沙块下落的过程中,所有与下落沙块相邻的其他沙块也会被扰动并开始下落。具体来说,在格子 $(i,j)$ 被扰动的沙块会穿过该列中从 $(i,j)$ 到底部的所有格子,并在途中扰动所有相邻的格子。这里,相邻格子指的是 $(i-1,j)$、$(i,j-1)$、$(i+1,j)$ 和 $(i,j+1)$(如果它们在棋盘内)。注意,新下落的沙块也会继续扰动其它沙块。 每次操作你可以扰动任意一块沙子。当每一列的沙子计数器中至少有 $a_i$ 块沙子时,谜题就被解决了。 你的任务是求出解决这个谜题所需的最少操作次数。注意,Little Dormi 保证给你的谜题一定有解。

输入格式

第一行包含两个用空格分隔的正整数 $n$ 和 $m$($1 \leq n \cdot m \leq 400\,000$)。 接下来的 $n$ 行,每行包含 $m$ 个字符,描述棋盘的每一行。如果某个字符为 '.',则对应格子为空;如果为 '\#',则该格子中有一块沙子。 最后一行包含 $m$ 个非负整数 $a_1,a_2,\ldots,a_m$($0 \leq a_i \leq n$),表示每一列底部计数器中至少需要落下的沙子数。在本题版本中,$a_i$ 总是不大于第 $i$ 列中沙子的数量。

输出格式

输出一个非负整数,表示解决谜题所需的最少操作次数。

说明/提示

例如,第 $1$ 个样例中,通过扰动第一行最左边第一列和第六列的两块沙子,以及第二行第四列的那块沙子,可以使每一列都达到所需的沙子数量。可以证明,少于 $3$ 次操作无法完成,因此答案为 $3$。下图为第一个样例的谜题。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1534F2/3a2f28320c431f7fc4be328a7626876c2ea55199.png) 例如,第 $2$ 个样例中,通过扰动第一行最右边一列的格子,可以使棋盘上所有沙子都落入底部计数器。因此答案为 $1$。下图为第二个样例的谜题。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1534F2/a5e473b6fa07dabecf94f6cfb85782199edfaea0.png) 例如,第 $3$ 个样例中,通过扰动第一行最右边一列的格子,可以使每一列都达到所需的沙子数量。可以证明,少于 $1$ 次操作无法完成,因此答案为 $1$。下图为第三个样例的谜题。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1534F2/1fc3ea7256a4b5592bfedf787a418e8660ce837b.png) 由 ChatGPT 4.1 翻译