[Codeforces Round #794 (Div. 2) E](https://codeforces.com/contest/1686)

Codeforces Round #794 (Div. 2) E

题意:给你一个括号序列,请输出最少翻转次数以及方案,使得该括号序列成为一个合法序列。

题解:个人感觉是相当不错的一道思维题。

首先,我们不难想到要让括号序列做一个转换,'(' 变为1,')'变为-1,最后成为一个整数数组,如果这个数组的全部前缀和都是非负数,则证明这个序列一定是合法括号序列。

接下来的这个性质就非常有意思。

性质1:任何题意中的括号序列,最多只需要两次就可以变换为一个合法序列。

这个性质好像神来之笔,其实也有迹可循,我们希望所有的前缀和都是一个非负数,结合翻转,我们发现一个所有前缀和之中,前缀和最大的位置或许很有用。

不妨假设前缀和最大的位置为\(i\)(如果有多个位置最大,任取其中一个),顺便定义原数列的前缀和数组\(pre\).

我们可以发现,如果我们把\([1,i]\)做个翻转,不难看出翻转后的前缀和为\(pre_i - pre_j (j<=i)\),这个一定满足非负 .那么如果\(j>i\)呢,也非常简单,我们只需要把\([i+1,2*n]\)再做个翻转就好,简单证明如下,首先数列无论如何翻转,最后所有数的和一定是0,我们可以得到,翻转后的后缀和其实等于\(pre_j - pre_i\),由于\(pre_i\)一定最大,所以\(pre_j - pre_i <= 0\),则前缀和为\(0-(pre_j - pre_i)>=0\),得证。

那么既然最多为2次,我们就只需要考虑,0次和1次翻转就合法的情况了,首先0次的,就是在一开始判断一下,很好处理,我们仔细思考一下关于一次翻转就合法的情况。

首先我们找到所有\(pre_i\)为负数的情况,定义其中最小的为\(l\),最大的为\(r\),我们首先可以发现如果最后翻转的区间为\([L,R]\),则一定要满足\(L<=l,R>r\),简单证明如下,如果不满足的话,那么一定有前缀为负值,那么一定不合法。但是得到这个结论之后,发现情况还是太多,我们需要更进一步的性质。

那么,新性质来了。

性质2:如果存在\([L,R]\)翻转使得原序列合法,那么\([L_1+1,R_1]\)翻转也一定合法。我们定义\(L_1\)为所有满足\(L<=l\)之中前缀最大的位置,\(R_1\)也同理,为满足\(R>r\)之中前缀最大的位置.

接下来为简单证明: 首先\([L,R]\)之外的前缀一定满足合法条件,除此之外,如果全部满足\(pre_{R_1} - pre_i + pre_{L_1} >= 0\),则证明合法,对于\(L_1 <= i <= R_1\),如果存在\(pre_{R_1} + pre_{L_1} < pre_i\),则有\(pre_i > pre_{L_1}\)与条件矛盾,由此,可反证性质成立。

posted @ 2022-05-31 16:17  mafengfa  阅读(63)  评论(0)    收藏  举报