CF1340F Nastya and CBS
题意:你需要动态维护一个多种括号组成的,长度为
单点修改
查询
区间是否是一个合法的括号序列。
先考虑如何暴力回答单组询问。
用栈维护括号序列的匹配。若出现左括号,加入栈中。若出现右括号,查看栈顶是否为同类,若是,则弹栈,若不是(或栈为空),失配。
分块
对于每个块内,跑一次括号匹配。
此处允许栈为空的情况,此时要将右括号加入栈中。
若匹配时内部已经出现了失配,则对该块打上标记。
若没有失配,最终剩下的括号形如
回答询问时,将散块和整块的括号用栈再跑一次匹配。
先把散块按类似整块的方法整理。于是现在有若干段 “右右右左左左” 的括号序列等待合并。
这要求第
(兔队)线段树
对于每个线段树节点,维护内部匹配完之后剩下的括号,以及失配标记。
记左侧的右括号为
记要合并的两个点为
于是,我们在合并时需要查询
记
若
否则,观察
这时
,直接递归右儿子。 这时
。 若
,直接递归左儿子。 若
,则查询 ,然后左侧加上 。
综上,
询问时需要将拆分出的节点用栈记录,特殊写一个