1. 程式人生 > 其它 >國家集訓隊2018論文集《最小方差生成樹》命題報告 學習筆記/生成樹

國家集訓隊2018論文集《最小方差生成樹》命題報告 學習筆記/生成樹

國家集訓隊$2018$論文集《最小方差生成樹》命題報告 學習筆記/生成樹

這幾天出的第$4$道論文題,總的來說,程式碼量適中$(500+)$,遠遠小於前天程式碼$(1300+),$論文可讀性強,知識點基本掌握,是一道不可多得的不可做題,痛斥出題人$!$

題意大概是這樣,給定一張圖,求出一個價值最小的生成樹

生成樹的代價計算方式為生成樹邊權的方差

拿到這道題就去推式子,想搞出一個能夠直接用式子表示權值直接生成樹,結果失敗,然後考慮計算方差最小,肯定是選的越接近越好,繼續思考無果

這道題在考場上可以拿到$12+8$的子任務分數

暴力解法

這個$trick$就很妙.就是說每次列舉平均數,然後做一遍最小生成樹,是能保證最優的還是最優

因為方差在平均值等於$u$時候取到最小,每個都是這樣,感性理解的話,無論怎麼偏,都不會更優

畢竟是論文題,我們需要挖掘演算法的本質問題,我們現在的問題是,不一定是選最大的邊好,也不一定是選最小的邊好,那選相鄰的一部分是不會更差的,顯然離散程度會比選旁邊的小

顯然這裡不能隨便排序,一個邊的邊權因為和平均值有關,所以這個排序是不確定的

z這裡觀察一下,什麼時候排名會變,平均值經過兩數平均值的時候會改變,那麼一共$m^2$個端點,那麼任意兩個端點內部是不會發生變化的,直接$m^2$個最小生成樹就好了,複雜度$m^3log(m)$,這個過程是可以優化的,可以考慮用$LCT$調整最小生成樹,那就用新的小邊去替換大邊,具體實現不是很會,大概也會了,無非是看邊的排名有沒有變化,然後加進去看一下是否更優,只不過使用的$LCT$維護形態,$O(m^2logm)$常數巨大...

引出另一道題$Topcoder \ SRM\ 611\ Ega\ itarianism2$

$N$個點的完全圖求最小生成樹,邊多的時候,用$prim$是更優的,$O(n^6)[n<=20]$

那麼對於原題,其實還能繼續優化,我們在這已經有了一個$O(m^3logm)$的優秀演算法(在這裡不考慮$LCT$解法,畢竟常數好大,$splay$常數都$20+$了,還是過不了),我們考慮一下,是不是還有些東西沒有充分利用,的確有一部分,區間之間轉移的是不是不用每次重新跑最小生成樹

這裡給出結論$:$

這個結論挺強的,就是說一條邊如果存在於生成樹中,一定會出現在一段連續的區間的生成樹裡面,感性想一想,一個邊什麼時候會消失.他的排名發生變化了,或者其餘的邊發生變化了,導致被替代,放到二次函式就很顯然了

引理

在確定$u$的情況下,如果邊$i$在所有權值比他小的邊都放進去之後兩端點聯通,那麼就不在生成樹裡面,否則在生成樹裡面

這樣的話,我們可以把函式影象全都畫出來,然後找出$l_i,r_i$,怎麼找

我們只需要找到平均值區間讓他在裡面就好了,列舉每條邊,然後把邊權按平均值排個序,表示變化點,然後左端點就是找一個最小的平均值使得這條邊恰好不用放進去,就是把所有小的邊都放進去,並查集維護連通性就好了,小的邊怎麼找,就是把左函式單獨提取出來,找到所有交點,從大到小排,看加到哪個就不用這條邊了,那麼就找到了$l$,至於$r$是以一樣的,為啥是從大到小排序,顯然的,越近的話排名越小

我們現在得到了每個邊左右區間,這個時候區間就少了,只有$m$個,然後計算每個區間的生成樹就好$tql$,複雜度$O(m^2logm)$

複雜度瓶頸在於求$l_i,r_i,$可以考慮從小到大加邊,這樣是沒問題的,以為這樣保證了上面要求的按平均值排序,那麼這個每個邊該不該加進去就好判斷了,加邊然後$LCT$求最大生成樹就好了,還是說這裡是大常數

這個可以用一個結論優化一部分,邊$i,j$,如果最大生成樹$u_i,v_i$的最短邊$j$,那麼$l_i=r_j=(w_i+w_j)/2$,感性想一想函式影象就很顯然了

中間有一個關於乘積最小生成樹優化,然後沒用就寄了

上面已經解決了$T=1$,那麼$T=2$其實是對第一問擴充套件罷了

**寫到這我已經自閉了**

首先我們求出了最小方差生成樹,暴力的按照$T=1$的話,可以考慮在$[l_i,r_i]$外找個最小值,當然會$TLE$,當然正解只是對這個思路優化了一下

我們只需要求$n$條邊的答案就好了

刪掉了生成樹的一條邊,$l_i$變化的邊一定在右邊,$r_i$變化的邊一定在左邊

那麼要求出變化的$l,r$,還是從小到大插入,替換掉的最小邊就是$l_i=r_j=(w_i+w_j)/2$,複雜度$O(n^3/n^2logn+nm)$,高精度常數炸掉

繼續考慮優化,我們中間有一步直接得到了$m$個區間

每次修改我們改變的邊只有$n$個,那麼$l_i,r_i$改變的也是$n$個,不知道為什麼...

$Ans=\sigma^2\times N^2=s_2\times N-s_1^2$

由於我們範圍已經確定了,那麼這個東西就搞一個差分就好了,對於更改的位置呢

把原序列變化成了$n$個區間,我們這個東西的變化值有了,就是這一段$s$會發生的變化就知道了,我們就是求著每個區間的最小值就好了

$s_1$是和,$s_2$是平方和

$Ans=(s_{i2}+\det s_2)\times N-(s_{i1}^2+2\times s_{i1}\times\det s_1+\det^2s_1)$

這是個斜率優化式子,線段樹維護凸殼然後指標查詢就好了