题解 Boboniu and String

link
最大最小,先二分一下。
首先想了一个贪心。令一个串中 \(D=NUM_B-NUM_N\),一眼看过去 \(D\) 应该是取所有串最大值和最小值的平均数。但这样很容易 G。这就告诉了我们贪心不好做。

那我们是否可以求得一个范围?

并且,如果我们考虑 \(D\) 和总长两个因素的话,很容易出现他俩加起来 \(\mathrm{mod}\ 2\) 不为 \(0\),那么个数会出现小数,不好操作。

于是,我们直接考虑 \(B\) 的数量(记为 \(a\)),和 \(N\) 的数量(记为 \(b\)),把其看成一个点对 \((a,b)\)。则会出现 \((a-1,b-1),(a+1,b+1),(a,b+1),(a+1,b),(a,b-1),(a-1,b)\) 的操作。可以用笛卡尔坐标系考虑,但是对本题破题没有帮助。

那我们要找 \(a,b\) 的范围。对于已有的一对点(已有的一个串)\((p,q)\),有以下关系:
\(|a-p|\leqslant mid, |b-q|\leqslant mid\)
乍一看这样就行了,但是还有隐藏的条件\(a,b\) 的相对值。
由于没有 \((a+1,b-1)\) 之类的情况,则 \(|(a-b)-(p-q)|\leqslant mid\)

你以为这就完了?试想一下,我们通过一个 \((p,q)\) 得到了 \(a,b\) 以及 \(a-b\) 的范围,这些范围在全局都是必须参照的。万一通过其他串我们改变了 \(a,b\) 的范围,而此时这个 \(a-b\) 的限制或许在那个串时适用,但在这个串时有可能不适用。所以我们可以判断将 \(a,b\) 的最大值最小值代回去检验。

判断合法之后,即可求解。我们先确定 \(a-b\) 差值(取能取的最小值),这样 \(b\) 会更大。所以我们取 \(a\) 的最小值,两个数就一定合法了。还有一种情况就是 \(a=0,b=0\),所以我们要 check 两次,每次限制其中一个不为 \(0\)

Get 二分输出方案新写法:加个 “f”。

posted @ 2022-06-29 20:45  Saintex  阅读(42)  评论(0编辑  收藏  举报