\(\texttt{T1}\)
\(\texttt{題意}\)
有 \(n\) 個有重量的物品和一個大小為 \(m\) 的背包,一輪一輪裝物品,要求每輪裝盡量多數目的物品,且最大化拿走的物品按編號排序后的編號字典序,如此模擬下去求輪數。
\(n \leq 5\times 10^4,m \leq 10^9\)
\(\texttt{題解}\)
首先我們可以用 \(\Theta(n\log n)\) 的復雜度求出每輪刪的物品個數(不是一開始求出,而是每一輪同步進行),可以用堆做,也可以排個序用指針掃。
考慮一個一輪 \(\Theta(n)\) 解決的做法:
我們事先給物品排好序,記當前這一輪需要拿走 \(k\) 個,
然后在剩下的物品數組中,維護一個鏈表的同時一邊跳一邊 \(check\) .
這樣做復雜度是 \(\Theta(n^2),\) 但並不能通過全部數據。
考慮如果 \(k\) 比較小,可以在線段樹上維護拿走的物品集合,可以用類似歸並排序的方法實現,一次 \(update\) 復雜度 \(\Theta(k).\)
在維護好信息的情況下考慮每次找到下一個數字拿什么,在線段樹上二分就行,雖然一次查詢的復雜度是 $k\log n $ 但是總共不超過 \(n\) 次查詢因此總復雜度是 \(\Theta (nk\log n)\)
設一個閾值 \(B\) , \(k \geq B\) 時用 \(\Theta(n)\) 的暴力,當 \(k\) 開始 \(\leq B-1\) 的時候建線段樹維護即可。
復雜度 \(\Theta(\frac{n^2}{B}+n\log nB)\) , 取 \(B=\sqrt{\frac{n}{\log n}}\) 時時間復雜度為 \(\Theta(n\sqrt{n\log n})\) .
一個 \(\Theta(n\sqrt n)\) 的做法:
對於 \(k<B\) 的部分,分塊做,設塊長為 \(S\) ,每個塊用鏈表存一下排序結果即可,單次復雜度\(\Theta(B^2+B(S+\frac{n}{S})).\)
總復雜度\(\Theta(nB+n(S+\frac{n}{S})+\frac{n^2}{B}),\)取 \(B=S=\sqrt n\) 總復雜度為 \(\Theta(n\sqrt n)\)
如果空間卡的很緊,可以適當將 \(B\) 縮小,由於 \(\Theta(n)\) 的暴力常數很小所以問題也不大。
哦還有另一個 \(\texttt{polylog}\) 做法,大概是二分套樹套樹上二分,還要開倆線段樹,所以還是分塊吧
大概是,每一輪求出個數仍然是隨便求,然后二分 \(k\) 次下一個拿的數字的位置,二分里面要寫一個,支持 \(n\) 次刪除 的 查詢后綴 \(k\) 大值的數據結構,這個可以開兩個樹套樹來實現。這東西場上真的有人寫? 哦好像有很多,那沒事了
\(\texttt{T2}\)
\(\texttt{題意}\)
給你一顆帶點權樹,要選一個點集使得它是一條鏈,並且按照鏈的順序 , 點權序列是最長上升子序列,最大化最長上升子序列長度。
\(n\leq 10^5\)
\(\texttt{題解}\)
本來看到同學給我發這個題我覺得是個點分治,結果我 naive 了,原來可以直接線段樹合並,哈哈
直接線段樹合並,記值域上升/下降到當前值時候的 \(LIS\) 長度即可,每個點在樹上查詢並扔進線段樹即可。
答案在線段樹合並的同時不難維護。
\(\Theta(n\log n)\) , 當然也可以點分治/dsu on tree/啟發式合並,由於沒卡 \(2\log\) 甚至沒卡3log所以上述做法都能過。
\(\texttt{T3}\)
\(\texttt{題意}\)
有 \(n\) 個人和 \(m\) 種菜 , 第 \(i\) 個人對第 \(j\) 道菜的喜愛程度為 \(a_{i,j}\) , 如果 \(a_{i,j} = -1\) 則表示不喜歡 .
現在你要選擇一個菜的集合,你會獲得喜歡集合中所有菜的人對這些菜的喜愛程度之和的權值,最大化這個權值.
\(n\leq 20,m \leq 10^6\)
\(\texttt{題解}\)
知道題意的時候降智了,只會一個2nn2的做法,我好菜啊
顯然是個 \(fwt\) 題。
考慮求所有的人集合的答案。
對於一道菜 \(x\) ,記它對應的人的集合為 \(S\)
\(A[S] += \sum\limits_{i} a_{i,x}\) , \(A[S-(1<<i)] -= a_{i,x}\)
然后對 \(A\) 做 \(fwt\) 就行了。
\(\Theta(mn+n2^n)\)
\(\texttt{T4}\)
\(\texttt{題意}\)
\(m\) 測,要求實現對一棵有 \(n\) 個節點,兒子有順序的無標號樹的編碼和解碼,只能用一個 __int128
.
\(n \leq 70,m \leq 10^5\)
\(\texttt{題解}\)
吐槽一下,學弟告訴我題意的時候我以為有標號,結果覺得完全不能做(信息量不夠),哈哈
兒子有順序的話,一棵樹對應唯一一個括號序列,且這個括號序列的開頭結尾必然是一對匹配的括號,因此將它們去掉,剩下一個長度為 \(2(n-1)\) 的括號序列,由於 \(Cat_{69} < 2^{128},\) 所以對括號序列編碼即可。
編碼可以用字典序來編碼,轉移的過程可以事先 \(dp\) 好,存在 static
里.