题目
给出一个括号序列,每次操作给出一个区间 [ L : R ] [L:R] [L:R],将区间内括号取反,并回答操作后整个括号序列还是否合法。
解题思路
将(看做1 ,)看做-1。得到新的数组 a i a_i ai
一个括号序列合法的判断条件是在任意位置,a数组的前缀和为非负数,并且数组和为0。
线段树维护区间前缀最小值核心代码:
tr[k].pre_min = min(tr[LSON].sum + tr[RSON].pre_min, tr[LSON].pre_min);
AC代码
#include <bits/stdc++.h>
using namespace std;
char a[100010];
struct node
{
int k, l, r, pre_min, pre_max, sum, lazy;
} tr[400010];
void pushup(int k)
{
tr[k].pre_min = min(tr[k * 2].sum + tr[k * 2 + 1].pre_min, tr[k * 2].pre_min);
tr[k].pre_max = max(tr[k * 2].sum + tr[k * 2 + 1].pre_max, tr[k * 2].pre_max);
tr[k].sum = tr[k * 2].sum + tr[k * 2 + 1].sum;
}

本文介绍了一种使用线段树维护括号序列合法性的方法。通过将括号转换为数值,利用线段树进行区间翻转操作并快速判断括号序列的合法性。适用于算法竞赛中的动态区间修改问题。
最低0.47元/天 解锁文章
1349

被折叠的 条评论
为什么被折叠?



