P2882. Face The Right Way G
考点
- 贪心
- 差分
题解
1 |
|
思路
在固定k的情况下,如何让m最小呢?先翻转B个数多的那一段k吗?万一每段k的B个数相同该怎么办?
贪心的侧重点不在增加k中
B的个数,而是尽可能减少修改k中的F;
白话文就是,尽可能减少拆东墙(改变F)补西墙(改变B)的次数。
如下图所示,范围[1, 3]内都是连续的F,图2显然比图1更优:
- 图1拆了
[1, 3]内的一个F,且不管后续如何,对于[1, 3]而言这就是劣的 - 图2没拆
[1, 3],且不管后续如何,对于[1, 3]而言这就是优的
制定最终的贪心思路:
尝试维护一个
[1, n]的最长连续F序列,遍历顺序应该是从左到右或从右到左;这里选择从左到右。
假设当前下标为
x,[1, x - 1]已经是连续的F序列,不能回头动这个区间;那么只要当前为
B,就向右修改[x, x + k - 1]。如果最后
[n - k + 2, n]区间内还有B,说明贪心失败;反之成功。
修改区间可以用双指针,但是时间复杂度为平方级,用差分进行优化。
最后一个问题,枚举k可以用二分优化吗?
显然不可以,k小难道m就小了吗?k大难道m就大了吗?
只能暴力枚举啦~