1. 程式人生 > >BZOJ 2038 2009國家集訓隊 小Z的襪子【模板·莫隊】

BZOJ 2038 2009國家集訓隊 小Z的襪子【模板·莫隊】

com 技術 bsp 高效 題解 數量 div image 概率

技術分享圖片

【題解】

  1,先說說莫隊算法。

    莫隊算法是用來離線處理區間問題的算法。非常易於理解和使用,且運用十分廣泛。

    假設我們現在已知區間[L,R]的答案,如果我們能以較低的時間復雜度擴展得到區間$[L-1,R],[L+1,R],[L,R-1],[L,R+1]$的答案,我們就可以使用莫隊算法。通常可以接受的擴展的時間復雜度為$O(1)$或者$O(logN)$.

    那麽莫隊算法具體是怎樣的呢?首先我們把詢問按照區間左端點分成$\sqrt{n}$塊,同一塊內按照區間右端點進行排序。當我們按調整後的順序處理詢問時,如果左端點比詢問區間的左端點小,那就把左端點右移,如果左端點比詢問區間的右端點大,那就把左端點左移;右端點也同理。然後再把處理好的詢問按原來的順序儲存。

    為什麽這樣做可以保證時間復雜度?假設擴展的時間復雜度為$f(n)$,區間長為$n$,詢問次數為$m$。顯然,對於每次詢問,左端點最多移動$\sqrt{n}$次,那麽移動左端點的總時間復雜度就是$O(f(n)*\sqrt{n}*m)$;右端點移動次數與詢問次數無關,即在同一個塊內,右端點最多移動n次,那麽移動右端點的時間復雜度就是$O(f(n)*\sqrt{n}*n)$.  $m$和$n$同階,那麽莫隊算法的時間復雜度就是$O(f(n)*\sqrt{n}*n)$.

    還有一個常數優化,就是當塊的編號為奇數時,把詢問按照區間右端點從小到大排序;當塊的編號為偶數時,把詢問按照區間右端點從大到小排序。這樣可以減少右端點移動的次數。實測可以有效提高效率。

  2,本題是莫隊算法的基礎題。假設共有n只襪子,每種顏色的襪子的數量是cnt[i],選中同色襪子的概率是$Sigma(0.5*cnt[i]*(cnt[i]-1))/(0.5*n*(n-1))$.

BZOJ 2038 2009國家集訓隊 小Z的襪子【模板·莫隊】