题目链接 : 点击打开链接
题目大意 : 给一个括号已经匹配好的序列,每次反转一个括号, 然后让你再次反转一个括号再次使得括号匹配,并且你反转的位置尽可能的靠近左端。
可以对于每个位置,记录它之前的左括号的数量减去右括号的数量,这个序列合法的条件就是每个位置不会出现值小于0的情况。最后一位一定是0.
如果他反转的是右括号,这个位置变成左括号之后 你需要找到一个左括号把它反成右括号。而你需要找的位置就是从最后一个往前最后一个为大于等于2的位置。
如果他反转的是左括号,那就找到最左边的右括号。
两种情况分别都可以用线段树维护
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#define MAX 0x3f3f3f3f
#define N 300005
#define mod 1000000007
#define lson o<<1, l, m
#define rson o<<1|1, m + 1, r
typedef long long LL;
const double pi = acos(-1.0);
using namespace std;
int n, q, X, A, B, mi[N<<2], add[N<<2];
bool E