知识点:表达式求值、链式前向星
分析:
由题意得,题目的表达式是后缀表达式,所以可以用栈建立一棵表达式树,然后从根结点向下递归求出表达式树的值。
因为计算过程只会出现逻辑运算,所以就可以利用'&'、'|'运算的短路性质,预处理出每个结点u的左右儿子发生变化时,是否影响到了最终的计算结果,即表达式的值。这样,每次询问就能在O(1)的时间复杂度内返回答案。
预处理出每个结点u的左右儿子发生变化时,我们可以对根结点的影响可以使用两次DFS:
第一次DFS求出所有非叶子结点u的值w[u]和表达式的值
第二次DFS求所有非叶子结点的值发生变化时能够影响到根结点的值:
如果当前运算符是'!',子结点发生变化,就能影响到根结点的值
如果当前运算符是'&',两个子结点分别为a和b,如果w[a]是1,b结点发生变化,就能影响到根结点的值;如果w[b]是1,a结点发生变化,就能影响到根结点的值;
如果当前运算符是'|',两个子结点分别为a和b,如果w[a]是0,b结点发生变化,就能影响到根结点的值;如果w[b]是0,a结点发生变化,就能影响到根结点的值
AC代码
欢迎加入团队