题面:https://codeforces.com/contest/1686/problem/E
大致题意:给定2*n个括号序列,其中含有n个左括号,n个右括号,可以对任意区间进行reverse操作,求最少需要多少次操作能使该序列左右括号匹配
题解:将左右括号抽象成1和-1,则左右括号的匹配条件转化成了对任意的i满足
考虑reverse操作,对区间外的pre不造成影响,对区间内的序号为i的元素,其反转后(序号发生了改变,等式中用原序列的编号表示),要满足pre>=0,则,故我们易想出预先处理出pre值,记录第一个和最后一个pre<0的下标
若一次reverse操作即可满足条件,则该区间必须包含所有pre<0的元素,是否满足条件仅取决于区间pre与边界pre的大小关系,故我们取pre最大的位置为R、L+1(这里有个小细节)
若一次reverse无法满足条件,考虑能否用两次reverse操作完成,易联想到取pre最大的序列为i,则反转1~i与i+1~n即可满足条件
证明:再次引用上述不等式,反转1~i时,为所有pre中的最大值,为0;反转i+1~n时,为所有pre中的最大值,为0,故一定能满足条件
1 |
|
注意在取mxl时,有可能mxl=fir(“(((“的情况),则此时mxl再加1会导致有pre<0的元素不在reverse区间内,故mxl不能加1