UOJ #806. 【UR #25】見賢思齊

275307894a發表於2024-06-30

題面傳送門

差點非常唐地寫平衡樹了(

首先考慮一棵樹怎麼做,其中根節點每次增加 \(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

相關文章