题意:就是给你一个匹配好的括号串长度为n,在给你m个操作,每个操作就给翻转摸一个位置的括号,对于每一个操作,你要找到一括号将其翻转,使得最后这个串还是匹配的,若存在多个解,翻转最左边的那个括号。
思路:如果操作是翻转有某个括号,那么我们一定的翻转与之相反的而一个括号。
把左括号转化为1,有括号转化为-1,用线段树来维护前缀和;
因为若一个完全匹配的括号串,他的每一个位置的前缀和一定是大于等于0的;
当操作将在i位置右括号翻转,那么i位置以后的所有前缀和都加2;
我们要是的这个达到平衡,于是就去寻找一个左括号翻转,使得其后面的前缀和都减二,最终达到平衡。
对于这个左括号怎么找?我们可用二分,因为操作之影响i位置以后的前缀和,i之前的是不会改变的;
因此我们只要找到一段区间,这段区间内每一个数都大于等于二。
当操作将左括号翻转的时候,和上面的思路一样,但是这个时候你只要在这个i位置之前找一个最左边的左括号j就可以了;
为什么?因为把这个左括号j翻转(j在i前面),j之后的都加上2,这样是不是保证后面一定是每一个前缀和都是大于等于0的。
于是我们要去寻找一个最左边的括号。这个相对比较简单,可以直接用set来维护。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include