把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

UOJ #806. 【UR #25】见贤思齐

题面传送门

差点非常唐地写平衡树了(

首先考虑一棵树怎么做,其中根节点每次增加 \(1\)

\(f_i(x)\) 表示 \(i\) 号点在 \(x\) 时刻的值,如果我们已经确定了 \(p_i\) 的函数,现在来考虑确定 \(i\) 的函数。

显然,第 \(i\) 个人第 \(j\) 天的值要在 \([a_i,a_i+j]\) 区间内,其次,手玩一下可以发现,值就是 \(f(p_i,j-1)+1\),因此有 \(f(i,j)=\max(a_i,\min(a_i+j,f(p_i,j-1)+1)\)

表现在函数差分值上,就是先将前面一段替换成 \(0\) 或者 \(1\),然后插入一个 \(1\),删除最后一个差分值。可以用线段树维护。

然后考虑在基环树上,我们发现环上最小值的点永远是最小值,因此其一直是 \(+1\) 的,所以可以断环为链,然后就是树的情况了。

但是我们实际上是可以倍增的!这个过程可以看做一个初始值不断归入一些区间的过程,则我们从后往前找到第一个位置使得区间无交,就可以确定最后函数值是什么了,这可以用一个倍增实现,代码非常好写。

submission

posted @ 2024-06-30 15:37  275307894a  阅读(51)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end