题目链接
思路
对于每一个线段树维护以下三个值:
a:结点内没有匹配的左括号数量
b:结点内没有匹配的右括号数量
c:结点内完成“()”匹配的数量
对于每一个结点u维护:
t r [ u ] . c = t r [ u ∗ 2 ] . c + t r [ u ∗ 2 + 1 ] . c + m i n ( t r [ u ∗ 2 ] . a , t r [ u ∗ 2 + 1 ] . b ) tr[u].c=tr[u*2].c+tr[u*2+1].c+min(tr[u*2].a,tr[u*2+1].b) tr[u].c=tr[u∗2].c+tr[u∗2+1].c+min(tr[u∗2].a,tr[u∗2+1].b)
表示左子树中匹配完成的数量+右子树中匹配完成的数量+左子树中(的数量和右子树中)数量的匹配,取其最小值。
对于该节点剩余的a的数量和b的数量也只要对应的加一下并减去已经匹配完的数量即可。
t r [ u ] . a = t r [ u < < 1 ] . a + t r [ u < < 1 ∣ 1 ] . a − m i n ( t r [ u < < 1 ]