代碼可以在loj上看我的提交記錄。
Day 1
[LOJ6029]市場
對於一次除法操作,若區間內所有數的減少量均相同則可視作區間減法,否則暴力遞歸下去。顯然一個線段樹節點只會被暴力遞歸進去\(\log(\text{Max-Min})\)次。對每個點定義勢能函數,每次暴力遞歸都會減小勢能,而修改操作只會使\(\log n\)個節點恢復原勢能,所以復雜度\(O((n+m\log n)\log a)\) 。
[LOJ6030]矩陣
顯然需要構造出一行全黑,然后用這行全黑去覆蓋剩下所有非全黑行即可。
考慮把第\(i\)行構造成全黑。只需要第\(i\)列上有黑色就可以一個一個地全部覆蓋成黑色,否則若第\(i\)行原本至少存在黑色則可以先用一次操作讓第\(i\)列有黑色。
可以發現無解當且僅當不存在黑色。
[LOJ6031]字符串
首先觀察到\(qk\le10^5\) 。
如果\(k\)較小,則可以\(k^2\)地計算\(w\)的每個子串在\(s\)中的出現次數,再算一下對\(w\)的所有詢問中每個子串分別被問了多少次,復雜度\(O(qk^2)\)。
如果\(k\)較大,那么可以對所有串建廣義\(\text{SAM}\),然后暴力枚舉每次詢問,倍增定位出當前詢問區間對應子串的后綴自動機節點,復雜度\(O(qm\log n)\)。
將上述兩者結合即可。
Day 2
[LOJ6032]水箱
根據隔板高度可以建出一個\(2n-1\)個點的樹形結構,可以將每個要求倍增定位到樹上節點,然后就是一個簡單樹\(dp\),記\(f_{i,0/1}\)表示\(i\)號點是否被水淹沒時最多可滿足的要求數目,在每個點內按要求的高度排序,貢獻是前綴\(1\)的數量加上后綴\(0\)的數量。
[LOJ6033]棋盤游戲
經典的二分圖博弈模型。對所有空格做二分圖匹配,若某個點一定在最大匹配中則從該點出發先手必勝,否則后手必勝。由於點數較多所以需要用網絡流實現二分圖匹配。
[LOJ6034]線段游戲
李超線段樹模板題。
Day 4
[LOJ6035]洗衣服
求出\(f_i,g_i\)分別表示洗干凈/烘干前\(i\)件衣服的最短時間,那么答案就是\(\min_{i=1}^n\{f_i+g_{n-i+1}\}\)。
[LOJ6036]編碼
對每個串設\(0/1\)變量表示問號處填什么,把所有串(含問號的串填上\(0/1\)后分別)插入\(\text{Trie}\)樹,向路徑上的點連邊。需要注意的是\(\text{Trie}\)樹上同一個節點內最多只能有一個取值為真,可以使用類似UOJ210尋找罪犯的方法優化建邊。
Day 5
[LOJ6038]遠行
兩棵樹合並以后新樹直徑的兩端點一定是原來兩棵樹直徑四個端點中的兩個。所以直接\(\text{LCT}\)維護連通塊內直徑即可。
[LOJ6039]珠寶
設\(f_{i,j}\)表示考慮完售價小於等於\(i\)的珠寶,花費\(j\)能夠獲得的最大收益。對於售價相同的所有珠寶肯定是優先選價值收益最大的,所以轉移函數是凸的,那么就決策單調性搞搞,復雜度\(O(mk\log m)\) 。
[LOJ6040]矩陣
首先求出矩陣\(C\)的秩\(r\),對於所有秩為\(r\)的矩陣它們的答案都是一樣的,所以就只需要求出“有多少對矩陣\((A,B)\)相乘得到的矩陣\(C\)的秩為\(r\)”后把答案除以秩為\(r\)的矩陣個數就行了。
設\(f_{i,j}\)表示一個\(i\times n\)的矩陣其秩為\(j\)的方案數。這個\(dp\)可以在\(O(n^2)\)的時間內完成。
然后考慮設\(A\)的秩為\(x\),那么能夠組成的\(C\)就有\(f_{x,r}\)種,而組成同一種\(C\)的\(B\)均有\(2^{n(n-x)}\)種,因此答案為\(\sum_{i=r}^nf_{n,i}f_{i,r}2^{n(n-x)}\),最后再除個\(f_{n,r}\) 。
Day 7
[LOJ6041]事情的相似度
\(\text{YCB}\)冬令營模擬搬的題目,要是再晚兩天考的話應該就做到了吧。
考場上寫的是\(\text{SAM+LCT}\)然后離線詢問按右端點掛鏈,\(\text{BIT}\)維護后綴最小值。具體來說就是兩前綴的\(\text{lcs}\)就是它們在前綴樹(正串建\(\text{SAM}\)構出的\(\text{parent}\)樹)上的\(\text{lca}\)的\(\text{len}\)值,所以相當於是要求區間內任兩點的\(\text{lca}\)的\(\text{len}\)的最大值。從左往右枚舉右端點,每次相當於做一個\(\text{access}\)操作,用\(\text{LCT}\)實現。
把樹狀數組換成可持久化線段樹可以做在線。貌似還有一種\(\text{SAM+dsu}\)的做法。
[LOJ6042]跳蚤王國的宰相
令\(S=\lfloor\frac n2\rfloor\)。
一個點要作為重心,就要求它的每個子樹大小不超過\(S\)。顯然只有原重心所在的子樹會不滿足這一條件,所以考慮把這一部分的大小砍到\(S\)以下。
顯然只會割原重心的相鄰邊,貪心優先割大的。同時有一個結論是所有點除原重心外答案相差不超過\(1\) 。
[LOJ6043]蛐蛐國的修牆方案
考慮\(i\)向\(p_i\)連邊,這樣的圖一定是由若干個環構成,且每個點的度數為\(2\)。因此為了有解,每個環的大小都應為偶數,且選取方案有且僅有兩種(考慮一條邊選或不選,其余的邊隨之確定)。
這樣就可以做到\(O(2^{\frac n2}n)\)的搜索復雜度。考慮到當環大小為\(2\)時,在左邊放左括號一定不會更劣,所以就只需要考慮所有大小大於等於\(4\)的環即可,復雜度\(O(2^{\frac n4}n)\)。
Day 8
[LOJ6044]共
實際上就是左側\(k\)個點右側\(n-k\)個點的完全二分圖生成樹計數。給點標號還需要乘上一個\(\binom {n-1}{k-1}\)。
完全二分圖生成樹計數可以用矩陣樹定理列出基爾霍夫矩陣后手解行列式,算出來結果是\((n-k)^{k-1}k^{n-k-1}\)。
[LOJ6045]價
先求出任意一組完美匹配,為了使左右兩邊選的點數相同,如果左邊的\(i\)點選了,其一條出邊指向右邊的\(j\)點,那么\(mat_j\)這個左邊的點也一定要被選。
“\(x\)選了\(y\)就一定要被選”,這是最大權閉合子圖的經典模型。最小割即可。
[LOJ6046]爺
\(\text{dfs}\)序轉區間。分塊暴力,定期重構。
建塊的時候保證塊內極差不超過\(10T\),且塊的長度不超過\(T\),塊內以值域為下標維護前綴和。
查詢就先二分答案再查區間內有多少個數\(\le k\)。
Day 10
[LOJ6047]決斗
找一個位置\(x\)使得沒有人會從\(x-1\)走到\(x\)。可以令每個位置上的值為\(A_i\)指向這一位置的精靈數量\(-1\),然后前綴和一下最小值出現的位置就是\(x-1\),其后面一個位置就是\(x\)。
然后就從\(x\)出發走,用一個\(\text{std::set}\)維護當前可自由選擇的精靈集合,類似田忌賽馬那樣操作即可。
[LOJ6048]數列
因為求的是嚴格上升,所以可以把數列反過來再在前面寫一遍,然后直接求最長上升子序列就是第一問的答案。
第二問,對最長上升子序列記個數,再乘上\(2^{n-maxlen-1}\)即可。
Day 11
[LOJ6052]DIV
復數的條件是\(ac-bd=n,ad+bc=0\)。
令\(a=px,b=qx,c=py,d=-qy(x,y,p\in N^+,q\in N,(x,y)=1,(p,q)=1)\),那么就有\(n=xy(p^2+q^2)\)。
我們要求的是\(\sum_{xy(p^2+q^2)=n,(p,q)=1}px\)。實際上還要當\(q\neq0\)時要乘\(2\),因為這里只枚舉了\(b>0\)的復數,而\(b<0\)的顯然是對稱的。
考慮轉化一下\(\sum_{(p^2+q^2)|n,(p,q)=1}p\sum_{x|\frac{n}{p^2+q^2}}x=\sum_{(p^2+q^2)|n,(p,q)=1}p\times\sigma(\frac n{p^2+q^2})\)。
把\(1\)到\(n\sum\)起來答案是
然后把\((p,q)=1\)這個限制反演掉就是
對於所有要計算的東西,預處理其前\(n^{\frac 23}\)項,剩下的暴力並記憶化,復雜度就對了吧。
