[CSP- 2020] 表达式(expr)

这篇博客介绍了如何解决CSP中关于表达式树的问题,特别是针对特定性质的表达式,可以避免使用线段树等复杂数据结构。通过建立表达式树,并进行预处理,标记每个节点对最终结果的影响。对于与(&)、或(|)和非(!)运算,博主详细解释了如何确定是否需要递归搜索子树。最后,根据mark数组更新根节点值并输出结果。
摘要由CSDN通过智能技术生成

昨天现学表达式树的我太难了

终于在某谷上抢到CSP题解的位置了

首先我们建立表达式树,像我一样不会的蒟蒻应该没有吧我可是全谷最弱的自行出门右转再左转再前行50m百度。

数的节点有一个特殊的值域:number,记录当前节点对应的 x i x_i xi 编号(如果当前节点是一个运算符就number=-1)。

浙道题有一个灰常特殊的性质:每次修改不影响后面的操作,也就是说我们用不着我开始想的线段树啥的

我们可以发现,对于每次修改,有可能会影响根节点的值,也有可能不会。什么时候会呢?预处理的时候,我们先计算出整个表达式的值,然后从根节点向下遍历。

m a r k [ i ] mark[i] mark[i] 表示修改 x i x_i xi 的值对结果是否有影响。

  • 如果当前节点是数字, m a r k [ n u m ] = t r u e mark[num] = true mark[num]=true

  • 如果当前节点是运算符:

    • 对于与(&)运算,如果它的右子树值为0,那么不管它的左子树的值怎么改变,当前这颗子树的值都不会改变(总是0),因此不需要递归搜索左子树,否则递归搜索左子树。右子树同理,如果左子树值为0,递归搜索右子树,否则不递归。

    • 对于或(|)运算,和与运算非常相似,如果它的右子树值为1,那么不管它的左子树的值怎么改变,当前这颗子树的值都不会改变(总是1),因此不需要递归搜索左子树,否则递归搜索左子树。右子树同理,如果左子树值为1,递归搜索右子树,否则不递归。

    • 对于非(!)运算,基本不需要介绍,直接递归搜索左子树即可(非运算是单目运算符,右子树不存在)

以上就是建树预处理的过程,写两个就行了 d f s dfs dfs QAQ。

然后,对于每次询问,如果 m a r k [ i d x ] = t r u e mark[idx] = true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值