[WC2016]鏖战表达式

一、题目

点此看题

二、解法

如何求解这个表达式的值?一个很显然的想法就是找到优先级最小的运算符然后把整个表达式分成两半,递归求解。

我们需要维护一棵表达式树,比如说 t r e a p treap ,它满足下列性质:

  • 每个节点是一个数字,或者是一个操作符。
  • 中序遍历结果原本的表达式。
  • 将数字视为最大的优先级,父节点的优先级小于子节点的优先级。

举个例子,(用了JZM的图, q w q qwq 在这里插入图片描述
还是按位置排序,但是我们的 f i x fix 就变成了优先级,这样一看,复杂度似乎得不到保证。

我们使用奇技淫巧:对于相同优先级的点 a , b a,b ,合并的时候以子树大小加权,概率选一个作为根,如 a a 的概率是 s a s a + b b \frac{s_a}{s_a+b_b} b b 的概率同理。这样的随机化可以保证均摊复杂度为 O ( k + log n ) O(k+\log n) ,建好树后暴力算即可。

咕咕咕
发布了217 篇原创文章 · 获赞 12 · 访问量 5144

猜你喜欢

转载自blog.csdn.net/C202044zxy/article/details/104077720