最后只得到了95分,而且不知道我的完整做法用在这个题上究竟对不对,就不发题解区了。为了防止讨论区题解我只提一下我做这题的时候用了这个技巧的那一部分吧。
就是我们有的时候会得到一种 O(n2) 的暴力算法,具体就是我们写了一个 solve(l, r) 函数,这个函数会暴力遍历区间中的每个位置直到找到满足某种条件的位置 p 然后递归 solve(l, p - 1) 再 solve(p + 1, r),在这个合法位置 p 没有特殊性质的时候这个算法的复杂度是 O(n2) 的。
但是我们只要从左右维护两个指针 pl,pr 两边同时向中间找,每次两个指针各走一步,这样的复杂度就变成了严格的 O(nlogn),具体我不是很会证,但是有一种理解方式是这个过程反过来就恰好是启发式合并。所以这个算法好像有个名字叫“启发式分裂”。
我做这题的时候想到的是尽可能将两个括号序列分出可以独立转化出来的若干组,然后将这些组中的两个序列分别计算拍成 ()()...()的最小操作次数加起来,最后所有组的和就是答案。这个划分的过程我就用到了上面说的这个技巧。
这个思路对不对啊。