题意
JOIOI 王国是一个 HHH 行 WWW 列的长方形网格,每个 1×11\times 11×1 的子网格都是一个正方形的小区块。为了提高管理效率,我们决定把整个国家划分成两个省 JOI 和 IOI 。
我们定义,两个同省的区块互相连接,意为从一个区块出发,不用穿过任何一个不同省的区块,就可以移动到另一个区块。有公共边的区块间可以任意移动。
我们不希望划分得过于复杂,因此划分方案需满足以下条件:
- 区块不能被分割为两半,一半属 JOI 省,一半属 IOI 省。
- 每个省必须包含至少一个区块,每个区块也必须属于且只属于其中一个省。
- 同省的任意两个小区块互相连接。
- 对于每一行/列,如果我们将这一行/列单独取出,这一行/列里同省的任意两个区块互相连接。这一行/列内的所有区块可以全部属于一个省。
现给出所有区域的海拔,你需要求出 m a x max max(JOI省海拔极差,IOI省海拔极差)的最小值。
首先观察题目,发现合法的划分一定是阶梯型,考虑二分答案,我们发现最大值和最小值不在同一块。
那么我们考虑两种阶梯形的情况,每次分别填入最大值和最小值一共四种情况,判定的时候我们可以利用阶梯长度递减的性质,贪心找到一个最优的阶梯,每次四种情况一起判定 如果一种可行那么当前答案就可行。
复杂度 O ( n m log L ) , L = m a x − m i n O(nm\log L),L = max - min O(nmlogL),L=max−min。
#include<bits/stdc++.h>
using namespace std;
int read()
{
int _ = 0, __ = getchar(), ___ = 1;
for(; !isdigit(__); __ = getchar()) if(__ == '-') ___ = -1;
for(; isdigit(__); __ = getchar()) _ = (_ << 3) + (_ << 1) + (__ ^ 48);
return _ * ___;