UOJ Round 25 B. 见贤思齐 倍增做法

发布时间 2023-06-06 14:48:31作者: zhoukangyang

\(f(x,t)\)\(t\) 时刻 \(x\) 的水平。

手玩一下发现 \(f(x,t)\) 开始的一段时间是 \(a_x\)\(a_x+t\),后面的一段时间是 \(f(p_x,t-1)+1\)

更加具体地,有 \(f(x,t) = \max(\min(f(p_x,t-1)+1,a_x+t),a_x) \quad (t>0)\)

那么我们设 \(g(x,t) = f(x,t)-t\),就有 \(g(x,t) = \max(\min(g(p_x,t-1),a_x),a_x-t)\)

直接维护 \(g\) 看起来并不是很方便,考虑维护一个 \(l=-\infin,r=\infin\),每次 \(l=\max(l,a_x-t)\)\(r=\min(r,a_x)\),并从 \(x\) 跳到 \(p_x\)。如果 \(l \ge r\) 了就可以直接确定答案了。这是这一部分的实现

因此倍增找最后一个 \(l<r\) 的位置,然后判一下最后的答案是什么就行了。

代码很好写