bzoj4129 Haruna's Breakfast

題目描述

Haruna每天都會給提督做早餐! 這天她發現早飯的食材被調皮的Shimakaze放到了一棵
樹上,每個結點都有一樣食材,Shimakaze要考驗一下她。

每個食材都有一個美味度,Shimakaze會進行兩種操作:

1、修改某個結點的食材的美味度;
2、對於某條鏈,詢問這條鏈的美味度集合中,最小的未出現的自然數是多少。即 mex\text{mex} 值。

請你幫幫Haruna吧。

題解

這裏補一下帶修莫隊和樹上莫隊的坑。

如果這題放在序列上的話,即求一段區間的 mex\text{mex} 值的話,那就可以帶修莫隊+對數字分塊即可做到 O(n53)O(n^{\frac{5}{3}}) 。於是補一下帶修莫隊。

帶修莫隊就是具有單點修改和區間詢問的莫隊,具體來說就是將詢問設有三個關鍵字: ll 所在的塊, rr 所在的塊,上一個修改的時間點,按照這個順序來排序。然後每次詢問的時候再維護 pp 指針表示進行了幾個修改操作即可。簡略證明一下複雜度:設塊的大小爲 BB ,修改次數爲 cc ,詢問次數爲 qq ,則對於 pp 指針來說,最壞移動 O(cn2B2)O(\frac{cn^2}{B^2}) 次,對於 ll 指針來說,最壞移動 O(qB)O(qB)(怎麼感覺在寫物理) ,對於 rr 指針來說,最壞移動 O(qB+n2B)O(qB+\frac{n^2}{B}) ,每次修改都是 O(1)O(1) ,於是複雜度爲 O(cn2B2+qB+n2B)O(\frac{cn^2}{B^2}+qB+\frac{n^2}{B}) 。一般題目不會說 c,qc,q 大小姑且當做 mm ,然後一般 n=mn=m ,於是爲 O(n3B2+nB+n2B)O(\frac{n^3}{B^2}+nB+\frac{n^2}{B}) ,當 BBn23n^{\frac{2}{3}} 時最優爲 O(n53)O(n^{\frac{5}{3}})

所以我們不妨考慮一下怎麼在樹上莫隊。

如何把一個序列表示成一棵樹呢? dfs\text{dfs} 序?no,這裏是一種特殊的歐拉序,它是當訪問到一個點的時候加入序列中,當它的子樹都訪問完的時候再加一次,所以這個序列總共有 2n2n 個點(即樹上每個節點都會被加入兩次)。然後我們設 st[x],ed[x]st[x],ed[x] 表示 xx 的初始和結束兩個位置。

對於詢問 x,yx,y ,設 st[x]<st[y]st[x]<st[y] ,於是我們分討一下:

1.若 xxyy 的祖先,那對於 [st[x],st[y]][st[x],st[y]] 這段區間來說,只有 (x,y)(x,y) 這條鏈上的點會被加入一次,剩下的點都會被加入兩次,所以我們只要維護一次的點即可。
2.若 xx 不是 yy 的祖先,則 ed[x]<st[y]ed[x]<st[y] ,那對於 [ed[x],st[y]][ed[x],st[y]] 這段區間來說, (x,y)(x,y) 這條鏈上只有 lcalca 沒有被加入,剩下的點都被加入一次,其它點都被加入兩次,所以特判一下 lcalca 即可。

這樣就完成了樹上莫隊啦!效率爲 O(n53)O(n^{\frac{5}{3}})

代碼正在碼中,反正bzoj掛了(其實我想先交上作業)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章