题意
给定一个长度为
n
n
n的括号序列,有
q
q
q次操作如下:
1.把一个位置
p
p
p的括号方向反转。
2.询问一个区间
[
l
,
r
]
[l,r]
[l,r],求把它变为一个合法括号序列最小需要删除的括号个数。
3.与2类似,但要求反过来看(即从r到l看,但括号方向不反转)也是一个合法括号序列。
数据范围:
n
,
q
≤
300000
n,q\le300000
n,q≤300000
题解
对于括号序列问题,考虑转移到坐标系上更直观。
把区间
[
l
,
r
]
[l,r]
[l,r]的括号序列看作在坐标系上,以
(
l
−
1
,
0
)
(l-1,0)
(l−1,0)为起点,对于每个位置,先向右走一步,是‘(’则向上走一步,否则向下走一步。正着看合法即为没有走到x轴下面。于是对于操作2显然有一走到
x
x
x轴下方则删掉(相当于把它后面的整个图像向上平移一格),答案即为走到的最低点的纵坐标。
对于操作3,发现反过来合法即为从左向右看,最高点纵坐标不超过
r
r
r的纵坐标
y
r
yr
yr,如果仅满足反向,做法也同理。考虑正反两个方向结合,发现从左往右贪心时,
y
r
yr
yr受到的影响(即增加量)一定是最大的,故它与从后往前的贪心不冲突,又这个贪心一定会使向上平移的“量”尽量小,故先正着贪心再反着贪心一定是最优的。
考虑如何简便地计算反着做的答案,通过画图发现正着做完后,对每一个点,它的纵坐标变为它与前面最小的纵坐标的差值
d
x
dx
dx,于是要求的就是区间
d
x
dx
dx的最大值和
d
x
r
dx_r
dxr的差,用线段树记录区间和、最值、极差,单点修改区间查询即可。