【CSU-2187】解题报告(维护顺序极差)
原始题目
2187: 翻转游戏加强版
- Time Limit: 1 Sec
- Memory Limit: 128 Mb
- Submitted: 101
- Solved: 23
Description
给当一个01串,最多可以对一段区间里的01取反一次,求最多能取得的1的个数
Input
多组数据,第一行为数组组数\(T(T≤10)\)
每组数据第一行一个整数\(N(1≤N≤{10}^{6})\)
第二行一个长度为\(N\)的01字符串
Output
每组数据输出一行代表答案
Sample Input
2
4
1001
4
1111
Sample Output
4
4
Hint
Source
题目大意
如题
解题思路
小规模数据采取枚举分界点的方法,时间复杂度\(O(n^{2})\)
仔细想一下,我们要找的是一个区间,里面0的数量与1的数量差最大。如果直接寻找区间有点难理解的话,我们 可以换一个角度,记录出现0和出现1的差值,求差值在翻转以后的最小值。
如图
那么如何求翻转以后的最小值?如果对每个区间下限进行计数,遇1减减,遇0加加,我们的答案就是不同起点的所有cnt值得最大值。
实际上我们就是找图中一个极小值(包括头点)与一个极大值(包括末尾)极差得最大值,而且需要注意得是我们求的是1的翻转次数最大,所以要求是一个极小值在左,极大值在右,左低右高。
再如图
- 线性从头扫一遍,维护最小值,同时重新计数cnt,最后求cnt的最大值。
解题代码
1 |
|
收获与反思
考虑单调性,维护记录值,最大/最小值。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!