1. 程式人生 > >NOI2015做題筆記

NOI2015做題筆記

因數分解 留下 沒有 當前 height 這一 支持 就會 suffix

程序自動分析(並查集)

NOI出這種題我還有什麽好說的呢……

拆點並查集即可。

代碼

軟件包管理器(樹鏈剖分、線段樹)

一個支持區間賦值和區間和的線段樹+樹鏈剖分即可

代碼

壽司晚宴(數論、狀壓DP)

數論題\(n \leq 500\)肯定是什麽暴力算法……

註意到每一個數\(> \sqrt{n}\)的因子最多只有一個,這意味著\(> \sqrt{n}\)的因子之間是獨立的,而只有\(\leq \sqrt{n}\)的因子之間會相互影響。而\(\leq \sqrt{n}\)的因子只有\(2,3,5,7,11,13,17,19\)總共\(8\)個,所以可以大力狀壓。

\(2-n\)之間的所有數質因數分解,記錄其中\(<\sqrt{n}\)

的因子的出現情況,按照\(> \sqrt{n}\)的因子分類,一組一組地加入並DP。設\(dp_{i,j,k}\)表示第一個人擁有的壽司中\(<\sqrt{n}\)的因子存在情況為\(i\),第二個人擁有的壽司中\(<\sqrt{n}\)的因子存在情況為\(j\),當前計算的\(> \sqrt{n}\)的因子的存在情況為\(k\)時的方案數,轉移看當前壽司分給第一個人還是第二個人。沒有\(> \sqrt{n}\)因子的數先單獨做一次。

代碼

荷馬史詩(Haffman樹、貪心)

K進制Haffman樹直接貪心。註意需要加入若幹個\(0\)使得總元素個數是\(K\)的倍數,否則答案可能不優。

代碼

品酒大會(SA、並查集)

跟後綴\(LCP\)長度有關,上\(SA\)。求出\(height\),考慮如何對於每一個\(r\)的詢問快速求出答案。不妨將\(r\)從大到小求解,那麽對於某一個後綴\(sa_k\),滿足\(LCP(suffix_{sa_p} , suffix_{sa_k}) \geq r\)\(p\)一定是一段區間,而且這一段區間隨著\(r\)的縮小不斷增大。

然後考慮如何拓展區間。考慮對於\(height_k=q\),當\(r>q\)的時候\(k\)位置兩端的區間不會越過\(k-1\)\(k\),而當\(r \leq q\)時這兩段區間就會合成一段區間。這個顯然是可以使用並查集維護的,並且可以比較輕松地在並查集上維護最大價值。

代碼

小園丁與老司機(DP、上下界網絡流)

第一問不難得到一個DP:設\(f_i\)表示從起點到\(i\)最多能夠經過多少棵樹。按照\(y\)坐標從小到大DP,對於每一個\(y\)坐標,先考慮它們下面的點的轉移,然後再考慮橫向的轉移。

再考慮第二問。首先我們需要求出可能留下非左右方向車轍印地面。這個可以這樣求:設\(g_i\)表示從\(i\)到任意一個終點最多經過多少棵樹,轉移跟上面的類似,但是這兩種轉移有一些細微的差別。在DP的過程中,每當找到一條非左右方向的路徑\((x,y)\)時,考慮\(f_x + g_y\)是否等於第一問的最優解,如果等於則表示這一條路需要軋路機。

找到了這些邊,然後我們需要求每一條邊至少經過一次的最小次數。不難發現這就是一個有源匯有上下界最小流問題,直接做就可以了。

細節比較多,代碼比較長,要細心一些~

代碼

NOI2015做題筆記